
    <html lang="zh-cn">
    <head>
    <meta content="text/html; charset=utf-8" http-equiv="content-type" />
    <link href="F:\v_awjliu\BKDocs\ZH/default.css" rel="stylesheet">
    </head>
    <body>
    <h1 id="cmdb">CMDB 如何管理主机</h1>
<h2 id="_1">情景</h2>
<p>新业务上线（常见的三层架构：接入层、逻辑层、存储层），需要用 CMDB 管理业务上线依赖的主机资源，便于后续实现发布、变更、故障处理等场景的自动化流程。</p>
<h2 id="_2">前提条件</h2>
<p>在配置平台中 <a href="../../../配置平台/产品白皮书/快速入门/case1.md">新建业务</a>，并导入主机及将主机分配到业务中。</p>
<h2 id="_3">操作步骤</h2>
<ul>
<li>梳理业务架构</li>
<li>新建服务模板+集群模板</li>
<li>通过集群模板新建集群</li>
<li>主机分配</li>
<li>使用场景：在作业平台中查询接入层的磁盘使用率</li>
</ul>
<h3 id="_4">梳理业务架构</h3>
<p>业务的架构设计最终要体现在 CMDB 的业务拓扑树上，所以我们先梳理业务的架构。</p>
<p>以业务“欢乐游戏( demo )"为例，其架构是常见的三层架构：<code>接入层</code> -&gt; <code>逻辑层</code> -&gt; <code>存储层</code></p>
<p>为了满足全国各地用户就近接入，按照地域划分了不同的区，但架构一致。</p>
<p><img alt="-w758" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15625775986620.jpg" /></p>
<h3 id="_5">新建服务模板+集群模板</h3>
<p>按照上述业务架构，可将做如下对应：</p>
<ul>
<li>业务中的区 &lt;-&gt; CMDB 中的集群</li>
<li>业务中的分层架构 &lt;-&gt; CMDB 中模块</li>
</ul>
<p>相关概念：【<a href="../../../配置平台/产品白皮书/产品功能/ServiceTemp.md">服务模板</a>】、【<a href="../../../配置平台/产品白皮书/产品功能/SetTemp.md">集群模板</a>】</p>
<ol>
<li>新建服务模板</li>
</ol>
<p><img alt="-w1396" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/1617778305968.png" /></p>
<blockquote>
<p>服务分类用于标识当前模块的实际功能组件，例如 mysql 组件、Nginx 组件，甚至业务的自定义组件等</p>
</blockquote>
<ol>
<li>新建集群模板</li>
</ol>
<p><img alt="-w1396" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210407145327.png" /></p>
<h3 id="_6">通过集群模板新建集群</h3>
<p>在<code>业务拓扑</code>中，选中根节点<code>业务</code>，新建节点<code>集群</code>一区。</p>
<p><img alt="-w1396" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210407145450.png" /></p>
<p><img alt="-w1396" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210407145557.png" /></p>
<p><img alt="-w1396" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210407145650.png" /></p>
<h3 id="_7">主机分配</h3>
<p>如果没有分配主机到业务空闲机池，请<a href="../../../配置平台/产品白皮书/快速入门/case1.md#导入主机到资源池">参考该文档</a>。</p>
<p>将业务空闲机下的机器分配到相应的模块</p>
<p><img alt="-w1396" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210407152010.png" /></p>
<h3 id="_8">节点信息配置</h3>
<p>根据业务侧的需要进行配置 业务、集群、模块 的节点信息。</p>
<ul>
<li>业务节点信息配置</li>
</ul>
<blockquote>
<p>业务节点信息，只能去【资源-业务-属性】进行修改</p>
</blockquote>
<p><img alt="-w1396" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210407153118.png" /></p>
<ul>
<li>集群节点信息配置</li>
</ul>
<p><img alt="-w1396" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/16177807973496.png" /></p>
<blockquote>
<p>环境类型：一般保持<strong>正式</strong>；测试环境设置为<strong>测试</strong>，让测试环境的发布流程模板只能选择<strong>测试</strong>集群；
服务状态：一般保持<strong>开放</strong>，在某些场景如开区准备的时候，状态可置为<strong>关闭</strong>，让发布系统无法选中；</p>
</blockquote>
<ul>
<li>模块节点信息配置</li>
</ul>
<p><img alt="-w1396" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210407154016.png" /></p>
<blockquote>
<p>模块类型：一般为<code>普通</code>，当模块类型为数据库类时，选择<code>数据库</code>
主要维护人、备份维护人：该模块维护人，一般在告警推送时会用到；</p>
<p>区别在于电话通知时优先<code>主要维护人</code>，如果<code>主要维护人</code>未接听，自动转<code>备份维护人</code>，此处逻辑需要自行实现；</p>
</blockquote>
<h3 id="_9">使用场景：在作业平台中查询接入层的磁盘使用率</h3>
<p>通过一个简单的场景，体验 <a href="../../../作业平台/产品白皮书/Introduction/What-is-Job.md">作业平台</a> 如何消费主机实例。</p>
<p>{% video %}media/cmdb_job_consume.mp4{% endvideo %}</p>
<h2 id="_10">扩展阅读</h2>
<h3 id="saas-cmdb">蓝鲸内置 SaaS 的 CMDB 消费场景</h3>
<ul>
<li><strong>应用发布、变更</strong>：资源编排工具 标准运维</li>
</ul>
<p>应用发布、变更流程包含版本在多台主机上的文件分发、命令执行等操作，如何优雅的选择这批主机，需要使用 CMDB 的查询主机实例功能。</p>
<p><img alt="CMDB场景-标准运维-01" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/CMDB场景-标准运维-01.png" /></p>
<p><center>（在标准运维中一次应用交付的执行历史）</center></p>
<p>在参数中使用<strong>动态 IP</strong>变量，<strong>运维无需关心主机扩缩容、故障替换等场景带来的主机变更</strong>，无需担心漏更新主机或更新错主机。</p>
<p><img alt="标准运维传参-CMDB" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/标准运维传参-CMDB.png" /></p>
<ul>
<li><strong>故障处理</strong>：监控、故障自愈</li>
</ul>
<p>针对业务架构中的某一层级模块（如接入层）设置一个 <a href="../../../监控平台/产品白皮书/functions/conf/rules.md">告警检测策略</a>，无需关心实例的新增、删除及修改。</p>
<p><img alt="蓝鲸监控的CMDB消费场景" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/蓝鲸监控的CMDB消费场景.png" /></p>
<p>如何实现实时感知，背后的逻辑是通过 CMDB 的事件推送功能，实时感知实例的新增、修改、删除等动作。</p>
<p><img alt="事件推送" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/事件推送.png" /></p>
<p>在 <a href="../../../故障自愈/产品白皮书/Intro/README.md">故障自愈</a> 中的消费场景也是如此，一个或多个模块的某一个告警，关联对应的处理动作。</p>
<p><img alt="故障自愈的CMDB消费场景" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/故障自愈的CMDB消费场景.png" /></p>
<ul>
<li><strong>平台团队对资源的管控</strong>，例如全业务 DBA、AIX SA</li>
</ul>
<p>以 DBA 为例，需要管控所有 DB，可将运行数据库的主机所属模块的类型设置为<code>数据库</code>，然后通过<code>动态分组</code>功能查询模块类型为<code>数据库</code>的主机。</p>
<p><img alt="-w1502" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210407155822.png" /></p>
<p>在 <a href="../../../作业平台/产品白皮书/Introduction/What-is-Job.md">蓝鲸作业平台</a> 中可使用该动态分组来选择 DB 主机。</p>
<p><img alt="-w1234" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15625757452328.jpg" /></p>
<h3 id="_11">三级拓扑不够用，怎么办？新建多级拓扑节点</h3>
<p>如果业务架构在大区（<code>集群</code>）之上还有一级（平台：如<code>Android_Weixin</code>、<code>Android_QQ</code>等）</p>
<p><img alt="-w814" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15625862638485.jpg" /></p>
<p>可在【模型-模型关系-编辑拓扑】中，<code>业务</code>与<code>集群</code>间新建一级或多级拓扑</p>
<p><img alt="-w1163" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210407160656.png" /></p>
<p>新的业务拓扑如下：</p>
<p><img alt="-w1521" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210407160900.png" /></p>
<blockquote>
<p>注：当前版本新增层级拓扑的生效范围是所有业务，在未来的某一个版本中可调整生效范围；</p>
<p>蓝鲸体系在未来的某一个迭代中，将重点弱化业务和细化权限。</p>
</blockquote>
<h3 id="master-db-slave-db">Master DB 和 Slave DB 如何实现物理架构的高可用</h3>
<p>两者一定不要放在同一个机架或交换机下，否则机架或交换机掉电，亦或是交换机故障，Master DB 和 Slave DB 都宕机，无法正常切换，导致业务无法对外提供服务。</p>
<p>操作方法：[模型] -&gt; [模型管理] -&gt; [主机] -&gt; [模型字段]，新增<code>存放机架 ID</code>、<code>网络设备 ID</code>。</p>
<p>此外，配置主机与机架或上联交换机的关联可使用<code>模型关联</code>，确保数据的唯一性可设置<code>唯一校验</code>，另外<code>字段分组</code>可调整 CI 属性的呈现方式。</p>
<p><img alt="-w1569" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210407164300.png" /></p><h1 id="cmdb">CMDB 如何管理云资源</h1>
<p>随着云计算的发展，上云已经成为了常态，云主机覆盖了不同的厂商，如何才能高效统一地纳管是必不可少的思考；蓝鲸配置平台提供了一套基础云资源同步功能，可以自动同步云资源的管理，以解决更新不及时，信息不准确等问题。</p>
<p>具体步骤为：</p>
<ol>
<li>创建云账户</li>
<li>创建云资源发现任务</li>
<li>分配云资源</li>
</ol>
<h2 id="1">1. 创建云账户</h2>
<p>首先需要在公有云申请创建一组可访问所有资源的“子账户”。不同公有云申请方式略有差异。目前配置平台暂支持腾讯云和 AWS 的账号同步能力，相关的账户申请方式可以参考以下文档：</p>
<ul>
<li>腾讯云：<a href="https://cloud.tencent.com/document/product/598/37140">https://cloud.tencent.com/document/product/598/37140</a></li>
<li>AWS：<a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html">https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html</a></li>
</ul>
<p>申请创建了账户以后，需要记录访问的 ID 和 KEY，在配置平台中创建账户。</p>
<p><img alt="image-20201103145902897" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/image-20201103145902897.png" /></p>
<p>填写了 ID 和 KEY 以后，点击“连通测试”按钮，以确保配置平台可以正常访问公有云的接口地址，同时校验 ID 和 KEY 的可用性。</p>
<p><img alt="image-20201103150038696" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/image-20201103150038696.png" /></p>
<p>创建账户成功以后，我们接下来可以去创建云资源发现任务。</p>
<p><img alt="image-20201103150214547" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/image-20201103150214547.png" /></p>
<h2 id="2">2. 创建云资源发现任务</h2>
<p>进入“云资源发现”功能，点击“新建”按钮，选择刚刚创建的腾讯云账户。</p>
<p><img alt="image-20201103150408059" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/image-20201103150408059.png" /></p>
<p>目前支持按照 VPC 的粒度同步主机资源，通过选择公有云的区域，找到需要同步的 VPC。</p>
<p><img alt="image-20201103150908555" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/image-20201103150908555.png" /></p>
<p>在云区域设定中完善设置：</p>
<ol>
<li>补充 VPC 对应的云区域名称：公有云一个 VPC 内主机 IP 资源不重复，与配置平台中云区域是一一对应的关系。后续此 VPC 下公有云资源都会同步到此 VPC 中</li>
<li>设定云主机录入到资源池的目录：配置平台发现一台新云主机，会优先放置到资源池的目录下，默认在“空闲机”目录。用户也可根据实际的部门或者用途划分，创建一个目录专用于存储新增的云主机资源</li>
</ol>
<p><img alt="image-20201103151136751" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/image-20201103151136751.png" /></p>
<p>创建完成会立刻启动一次同步任务，可以在列表中看到同步状态。</p>
<p><img alt="image-20201103151830674" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/image-20201103151830674.png" /></p>
<h2 id="3">3. 分配云资源</h2>
<p>公有云上的主机资源会被同步到资源池的设定目录中，通过“分配到”功能分配到实际的业务中应用。</p>
<p><img alt="image-20210421110104308" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/image-20210421110104308.png" /></p><h1 id="cmdb">CMDB 如何管理进程</h1>
<h2 id="_1">情景</h2>
<p>应用的存储是 MariaDB，在 CMDB 中注册 MariaDB，以便在监控系统做进程监控。</p>
<h2 id="_2">前提条件</h2>
<p>在配置平台中<a href="../../../配置平台/产品白皮书/快速入门/case1.md">新建业务</a> 及业务拓扑。</p>
<h2 id="_3">步骤</h2>
<ul>
<li>服务模板中新建进程</li>
<li>服务模板实例同步</li>
<li>监控系统自动实现进程端口监控</li>
</ul>
<h3 id="_4">服务模板中新建进程</h3>
<p>在<strong>业务 -&gt; 服务模板 -&gt; 新建或选择模板</strong>中<strong>新建进程</strong></p>
<p><img alt="-w1300" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210408102939.png" /></p>
<ul>
<li>进程名称：程序的二进制名称：<strong>mysqld</strong>；</li>
<li>进程别名：对外显示的服务名：<strong>MariaDB</strong>；</li>
</ul>
<p>在配置功能名称时，使用命令查询该程序的二进制名称</p>
<pre class="codehilite"><code class="language-bash">$ ps -ef | grep -i mysqld
mysql     7800     1  0 7月08 ?       00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql     7980  7800  0 7月08 ?       00:01:55 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock</code></pre>


<blockquote>
<p>注：监控系统一般<strong>完全匹配</strong>二进制名称。</p>
<p>获取二进制名称的方法：<code>basename $(readlink -f /proc/7980/exe)</code></p>
</blockquote>
<p>查询 mysqld 监听的 IP 和端口</p>
<pre class="codehilite"><code class="language-bash">$ netstat -antp | grep mysqld
tcp        0      0 10.0.4.29:3306          0.0.0.0:*               LISTEN      7980/mysqld</code></pre>


<ul>
<li>IP：MariaDB 为存储层，一般绑定内网 IP，故选择<strong>第一内网 IP</strong>。</li>
<li>Port：进程监听的端口，<code>3306</code></li>
<li>Protocol：<code>TCP</code></li>
</ul>
<h3 id="_5">服务模板实例同步</h3>
<p><a href="./CMDB_management_hosts.md#主机分配">CMDB 如何管理主机</a> 提到依据业务架构来划分业务拓扑，业务拓扑中模块代表服务，而服务将由一个或多个进程监听的端口来对用户或其他模块提供服务。</p>
<p>所以，需要将<strong>进程</strong>绑定至对应的<strong>模块</strong>上，这里将<strong>MariaDB</strong>进程绑定至存储层模块上，点击<strong>服务模板实例 -&gt; 批量同步 -&gt; 确认并同步</strong>。</p>
<p><img alt="-w1273" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210408104858.png" /></p>
<p><img alt="-w1273" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210408105033.png" /></p>
<p><img alt="-w1273" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210408105110.png" /></p>
<h3 id="_6">监控系统自动实现进程端口监控</h3>
<p>给模块 <a href="../../../配置平台/产品白皮书/快速入门/case1.md">分配主机</a></p>
<p><img alt="-w1541" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210408110332.png" /></p>
<p>等候一分钟，在蓝鲸自带的监控系统 <a href="../../../监控平台/产品白皮书/intro/README.md">监控平台</a> 中可以看到 <a href="../../../监控平台/产品白皮书/guide/process_monitor.md">进程的运行情况</a>。</p>
<p><img alt="-w1570" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15632804527438.jpg" /></p>
<p>点击 MariaDB 图标，可以查看其占用的 CPU、内存使用率以及文件句柄数等进程占用的资源指标。</p>
<p><img alt="-w1249" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15626645050893.jpg" /></p>
<h2 id="_7">扩展阅读</h2>
<h3 id="cmdb_1">监控系统消费 CMDB 中进程配置背后的逻辑</h3>
<p>当给模块分配完主机后，该主机的大部分 CI 属性将被自动推送至<code>/var/lib/gse/host/hostid</code></p>
<pre class="codehilite"><code class="language-json">{
  .....
     &quot;process&quot; : [
      {
         &quot;bind_ip&quot; : &quot;3&quot;,
         &quot;bind_modules&quot; : [ 68 ],
         &quot;bk_func_id&quot; : &quot;&quot;,
         &quot;bk_func_name&quot; : &quot;mysqld&quot;,  // 对应进程名称
         &quot;bk_process_id&quot; : 110,
         &quot;bk_process_name&quot; : &quot;MariaDB&quot;,  // 对应进程别名
         &quot;bk_start_param_regex&quot; : &quot;&quot;,
         &quot;port&quot; : &quot;3306&quot;,
         &quot;protocol&quot; : &quot;1&quot;
      }
   ]
}</code></pre>


<p>蓝鲸内置的进程监控采集器<code>processbeat</code>会读取该文件，并写入自身的配置文件<code>/usr/local/gse/plugins/etc/processbeat.conf</code>，以实现进程和端口的监控。</p>
<pre class="codehilite"><code class="language-yaml">......
processbeat.processes:
- name: mysqld // 二进制名称
  displayname: MariaDB
  protocol: tcp
  ports:
  - 3306
  paramregex: &quot;&quot;
  bindip: 10.0.4.29</code></pre>


<h3 id="java">二进制名称均为 java，该如何配置</h3>
<p>如 ZooKeeper、Hadoop 的二进制均为<strong>java</strong>，可用进程启动参数区分</p>
<p>进程的功能名称均为<code>java</code>，<code>启动参数匹配规则</code>中分别输入<code>zookeeper</code>、<code>kafka</code>即可。</p>
<pre class="codehilite"><code class="language-bash">$ ps -ef | grep -i zookeeper

root      5897     1  0 Nov14 ?        01:49:00 /data/bkce/service/java/bin/java -Dzookeeper.log.dir=/data/bkce/logs/zk/ -Dzookeeper.root.logger=INFO,ROLLINGFILE -Dzookeeper.DigestAuthenticationProvider.superDigest=bkadmin:1bF5dHUwvnyrhMDaPLkHwFS1JOg= -cp /data/bkce/service/zk/bin/../build/classes:/data/bkce/service/zk/bin/../build/lib/*.jar:/data/bkce/service/zk/bin/../lib/slf4j-log4j12-1.6.1.jar:/data/bkce/service/zk/bin/../lib/slf4j-api-1.6.1.jar:/data/bkce/service/zk/bin/../lib/netty-3.10.5.Final.jar:/data/bkce/service/zk/bin/../lib/log4j-1.2.16.jar:/data/bkce/service/zk/bin/../lib/jline-0.9.94.jar:/data/bkce/service/zk/bin/../zookeeper-3.4.10.jar:/data/bkce/service/zk/bin/../src/java/lib/*.jar:/data/bkce/etc:/data/bkce/service/zk/conf:/data/bkce/service/java/lib: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /data/bkce/etc/zoo.cfg
root     10220     1  2 Nov14 ?        13:17:41 /data/bkce/service/java/bin/java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Djava.awt.headless=true -Xloggc:/data/bkce/logs/kafka/kafkaServer-gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dkafka.logs.dir=/data/bkce/logs/kafka -Dlog4j.configuration=file:./../config/log4j.properties -cp /data/bkce/service/java/lib::/data/bkce/service/kafka/bin/../libs/aopalliance-repackaged-2.5.0-b05.jar:/data/bkce/service/kafka/bin/../libs/argparse4j-0.7.0.jar:/data/bkce/service/kafka/bin/../libs/connect-api-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/connect-file-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/connect-json-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/connect-runtime-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/connect-transforms-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/guava-18.0.jar:/data/bkce/service/kafka/bin/../libs/hk2-api-2.5.0-b05.jar:/data/bkce/service/kafka/bin/../libs/hk2-locator-2.5.0-b05.jar:/data/bkce/service/kafka/bin/../libs/hk2-utils-2.5.0-b05.jar:/data/bkce/service/kafka/bin/../libs/jackson-annotations-2.8.0.jar:/data/bkce/service/kafka/bin/../libs/jackson-annotations-2.8.5.jar:/data/bkce/service/kafka/bin/../libs/jackson-core-2.8.5.jar:/data/bkce/service/kafka/bin/../libs/jackson-databind-2.8.5.jar:/data/bkce/service/kafka/bin/../libs/jackson-jaxrs-base-2.8.5.jar:/data/bkce/service/kafka/bin/../libs/jackson-jaxrs-json-provider-2.8.5.jar:/data/bkce/service/kafka/bin/../libs/jackson-module-jaxb-annotations-2.8.5.jar:/data/bkce/service/kafka/bin/../libs/javassist-3.20.0-GA.jar:/data/bkce/service/kafka/bin/../libs/javax.annotation-api-1.2.jar:/data/bkce/service/kafka/bin/../libs/javax.inject-1.jar:/data/bkce/service/kafka/bin/../libs/javax.inject-2.5.0-b05.jar:/data/bkce/service/kafka/bin/../libs/javax.servlet-api-3.1.0.jar:/data/bkce/service/kafka/bin/../libs/javax.ws.rs-api-2.0.1.jar:/data/bkce/service/kafka/bin/../libs/jersey-client-2.24.jar:/data/bkce/service/kafka/bin/../libs/jersey-common-2.24.jar:/data/bkce/service/kafka/bin/../libs/jersey-container-servlet-2.24.jar:/data/bkce/service/kafka/bin/../libs/jersey-container-servlet-core-2.24.jar:/data/bkce/service/kafka/bin/../libs/jersey-guava-2.24.jar:/data/bkce/service/kafka/bin/../libs/jersey-media-jaxb-2.24.jar:/data/bkce/service/kafka/bin/../libs/jersey-server-2.24.jar:/data/bkce/service/kafka/bin/../libs/jetty-continuation-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jetty-http-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jetty-io-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jetty-security-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jetty-server-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jetty-servlet-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jetty-servlets-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jetty-util-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jopt-simple-5.0.3.jar:/data/bkce/service/kafka/bin/../libs/kafka_2.12-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/kafka_2.12-0.10.2.0-sources.jar:/data/bkce/service/kafka/bin/../libs/kafka_2.12-0.10.2.0-test-sources.jar:/data/bkce/service/kafka/bin/../libs/kafka-clients-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/kafka-log4j-appender-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/kafka-streams-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/kafka-streams-examples-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/kafka-tools-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/log4j-1.2.17.jar:/data/bkce/service/kafka/bin/../libs/lz4-1.3.0.jar:/data/bkce/service/kafka/bin/../libs/metrics-core-2.2.0.jar:/data/bkce/service/kafka/bin/../libs/osgi-resource-locator-1.0.1.jar:/data/bkce/service/kafka/bin/../libs/reflections-0.9.10.jar:/data/bkce/service/kafka/bin/../libs/rocksdbjni-5.0.1.jar:/data/bkce/service/kafka/bin/../libs/scala-library-2.12.1.jar:/data/bkce/service/kafka/bin/../libs/scala-parser-combinators_2.12-1.0.4.jar:/data/bkce/service/kafka/bin/../libs/slf4j-api-1.7.21.jar:/data/bkce/service/kafka/bin/../libs/slf4j-log4j12-1.7.21.jar:/data/bkce/service/kafka/bin/../libs/snappy-java-1.1.2.6.jar:/data/bkce/service/kafka/bin/../libs/validation-api-1.1.0.Final.jar:/data/bkce/service/kafka/bin/../libs/zkclient-0.10.jar:/data/bkce/service/kafka/bin/../libs/zookeeper-3.4.9.jar kafka.Kafka ../config/server.properties


ps -ef | grep -i kafka
root     10220     1  2 Nov14 ?        13:17:44 /data/bkce/service/java/bin/java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Djava.awt.headless=true -Xloggc:/data/bkce/logs/kafka/kafkaServer-gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dkafka.logs.dir=/data/bkce/logs/kafka -Dlog4j.configuration=file:./../config/log4j.properties -cp /data/bkce/service/java/lib::/data/bkce/service/kafka/bin/../libs/aopalliance-repackaged-2.5.0-b05.jar:/data/bkce/service/kafka/bin/../libs/argparse4j-0.7.0.jar:/data/bkce/service/kafka/bin/../libs/connect-api-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/connect-file-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/connect-json-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/connect-runtime-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/connect-transforms-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/guava-18.0.jar:/data/bkce/service/kafka/bin/../libs/hk2-api-2.5.0-b05.jar:/data/bkce/service/kafka/bin/../libs/hk2-locator-2.5.0-b05.jar:/data/bkce/service/kafka/bin/../libs/hk2-utils-2.5.0-b05.jar:/data/bkce/service/kafka/bin/../libs/jackson-annotations-2.8.0.jar:/data/bkce/service/kafka/bin/../libs/jackson-annotations-2.8.5.jar:/data/bkce/service/kafka/bin/../libs/jackson-core-2.8.5.jar:/data/bkce/service/kafka/bin/../libs/jackson-databind-2.8.5.jar:/data/bkce/service/kafka/bin/../libs/jackson-jaxrs-base-2.8.5.jar:/data/bkce/service/kafka/bin/../libs/jackson-jaxrs-json-provider-2.8.5.jar:/data/bkce/service/kafka/bin/../libs/jackson-module-jaxb-annotations-2.8.5.jar:/data/bkce/service/kafka/bin/../libs/javassist-3.20.0-GA.jar:/data/bkce/service/kafka/bin/../libs/javax.annotation-api-1.2.jar:/data/bkce/service/kafka/bin/../libs/javax.inject-1.jar:/data/bkce/service/kafka/bin/../libs/javax.inject-2.5.0-b05.jar:/data/bkce/service/kafka/bin/../libs/javax.servlet-api-3.1.0.jar:/data/bkce/service/kafka/bin/../libs/javax.ws.rs-api-2.0.1.jar:/data/bkce/service/kafka/bin/../libs/jersey-client-2.24.jar:/data/bkce/service/kafka/bin/../libs/jersey-common-2.24.jar:/data/bkce/service/kafka/bin/../libs/jersey-container-servlet-2.24.jar:/data/bkce/service/kafka/bin/../libs/jersey-container-servlet-core-2.24.jar:/data/bkce/service/kafka/bin/../libs/jersey-guava-2.24.jar:/data/bkce/service/kafka/bin/../libs/jersey-media-jaxb-2.24.jar:/data/bkce/service/kafka/bin/../libs/jersey-server-2.24.jar:/data/bkce/service/kafka/bin/../libs/jetty-continuation-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jetty-http-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jetty-io-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jetty-security-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jetty-server-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jetty-servlet-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jetty-servlets-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jetty-util-9.2.15.v20160210.jar:/data/bkce/service/kafka/bin/../libs/jopt-simple-5.0.3.jar:/data/bkce/service/kafka/bin/../libs/kafka_2.12-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/kafka_2.12-0.10.2.0-sources.jar:/data/bkce/service/kafka/bin/../libs/kafka_2.12-0.10.2.0-test-sources.jar:/data/bkce/service/kafka/bin/../libs/kafka-clients-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/kafka-log4j-appender-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/kafka-streams-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/kafka-streams-examples-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/kafka-tools-0.10.2.0.jar:/data/bkce/service/kafka/bin/../libs/log4j-1.2.17.jar:/data/bkce/service/kafka/bin/../libs/lz4-1.3.0.jar:/data/bkce/service/kafka/bin/../libs/metrics-core-2.2.0.jar:/data/bkce/service/kafka/bin/../libs/osgi-resource-locator-1.0.1.jar:/data/bkce/service/kafka/bin/../libs/reflections-0.9.10.jar:/data/bkce/service/kafka/bin/../libs/rocksdbjni-5.0.1.jar:/data/bkce/service/kafka/bin/../libs/scala-library-2.12.1.jar:/data/bkce/service/kafka/bin/../libs/scala-parser-combinators_2.12-1.0.4.jar:/data/bkce/service/kafka/bin/../libs/slf4j-api-1.7.21.jar:/data/bkce/service/kafka/bin/../libs/slf4j-log4j12-1.7.21.jar:/data/bkce/service/kafka/bin/../libs/snappy-java-1.1.2.6.jar:/data/bkce/service/kafka/bin/../libs/validation-api-1.1.0.Final.jar:/data/bkce/service/kafka/bin/../libs/zkclient-0.10.jar:/data/bkce/service/kafka/bin/../libs/zookeeper-3.4.9.jar kafka.Kafka ../config/server.properties</code></pre><h1 id="cmdb-db">CMDB 案例-DB 实例的管理</h1>
<h2 id="_1">情景</h2>
<p>应用使用的存储是 MySQL，为了便于 MySQL 的日常维护（如 SQL 变更），需要在 CMDB 中创建 MySQL CI 对象，录入 MySQL 实例。</p>
<blockquote>
<p>蓝鲸 CMDB 拥有灵活的 CI 能力，掌握该教程后，可以管理数据库、中间件、硬件等 CI 对象</p>
</blockquote>
<h2 id="_2">前提条件</h2>
<p>在配置平台中 <a href="../../../配置平台/产品白皮书/快速入门/case1.md">新建业务</a>，并 定义拓扑及分配主机。</p>
<p><strong>术语解释</strong>
- <strong>CI</strong> : (Configuration Items)，资源对象，如 <code>MySQL</code>、主机、交易系统、交换机、路由器等
- <strong>CI 属性</strong> : (Configuration Items Attribute)，资源对象的配置属性，如 MySQL CI 属性为实例名、IP、端口、存储引擎、数据库版本等
- <strong>CI 实例</strong> : CI 的实例化，唯一识别一个资源对象，如 MySQL CI 实例为<code>gd_area_master_01</code></p>
<h2 id="_3">操作步骤</h2>
<ul>
<li>梳理 : 梳理 MySQL CI 属性</li>
<li>建模 : 创建 MySQL CI 对象</li>
<li>实例化 : 添加 MySQL 实例</li>
</ul>
<h3 id="mysql-ci">梳理 MySQL CI 属性</h3>
<p>根据消费 MySQL 的场景，梳理 MySQL 常见的 CI 属性。</p>
<table>
   <tr>
      <td>字段分组</td>
      <td>唯一标识</td>
      <td>名称</td>
      <td>字段类型</td>
      <td>录入方式</td>
      <td>是否唯一</td>
      <td>是否必填</td>
   </tr>
   <tr>
      <td rowspan=11>Default</td>
      <td>bk_inst_name</td>
      <td>实例名</td>
      <td>短字符</td>
      <td>自动</td>
      <td>是</td>
      <td>是</td>
   </tr>
   <tr>
      <td>ip_addr</td>
      <td>IP地址</td>
      <td>短字符</td>
      <td>自动</td>
      <td>是</td>
      <td>是</td>
   </tr>
   <tr>
      <td>port</td>
      <td>端口</td>
      <td>数字</td>
      <td>自动</td>
      <td>是</td>
      <td>是</td>
   </tr>
   <tr>
      <td>version</td>
      <td>数据库版本</td>
      <td>短字符</td>
      <td>自动</td>
      <td></td>
      <td></td>
   </tr>
   <tr>
      <td>install_dir</td>
      <td>安装路径</td>
      <td>长字符</td>
      <td>自动</td>
      <td></td>
      <td></td>
   </tr>
   <tr>
      <td>dbfile_dir</td>
      <td>数据库文件路径</td>
      <td>长字符</td>
      <td>自动</td>
      <td></td>
      <td></td>
   </tr>
   <tr>
      <td>enable_binlog</td>
      <td>是否开启binlog</td>
      <td>枚举</td>
      <td>自动</td>
      <td></td>
      <td></td>
   </tr>
   <tr>
      <td>enable_slowlog</td>
      <td>是否开启慢查询日志</td>
      <td>枚举</td>
      <td>自动</td>
      <td></td>
      <td></td>
   </tr>
   <tr>
      <td>chart_set</td>
      <td>字符集</td>
      <td>短字符</td>
      <td>自动</td>
      <td></td>
      <td></td>
   </tr>
   <tr>
      <td>storage_engine</td>
      <td>存储引擎</td>
      <td>短字符</td>
      <td>自动</td>
      <td></td>
      <td></td>
   </tr>
   <tr>
      <td>db_size</td>
      <td>数据库大小</td>
      <td>数字</td>
      <td>自动</td>
      <td></td>
      <td></td>
   </tr>
   <tr>
      <td rowspan=6>核心参数</td>
      <td>innodb_buffer_pool_size</td>
      <td>innodb缓存池大小</td>
      <td>数字</td>
      <td>自动</td>
      <td></td>
      <td></td>
   </tr>
   <tr>
      <td>innodb_log_buffer_size</td>
      <td>innodb日志缓存大小</td>
      <td>数字</td>
      <td>自动</td>
      <td></td>
      <td></td>
   </tr>
   <tr>
      <td>innodb_flush_log_at_trx_commit</td>
      <td>innodb日志磁盘写入策略</td>
      <td>短字符</td>
      <td>自动</td>
      <td></td>
      <td></td>
   </tr>
   <tr>
      <td>thread_cache_size</td>
      <td>线程缓存大小</td>
      <td>数字</td>
      <td>自动</td>
      <td></td>
      <td></td>
   </tr>
   <tr>
      <td>query_cache_size</td>
      <td>查询缓存大小</td>
      <td>数字</td>
      <td>自动</td>
      <td></td>
      <td></td>
   </tr>
   <tr>
      <td>max_connections</td>
      <td>最大连接数</td>
      <td>数字</td>
      <td>自动</td>
      <td></td>
      <td></td>
   </tr>
</table>

<p>通过<code>实例名</code>可以唯一标识一个 MySQL 实例，具体是<code>IP</code>和<code>端口</code>的组合。</p>
<h3 id="mysql-ci_1">创建 MySQL CI 对象</h3>
<p>第一步梳理完 MySQL CI 属性后，接下来开始建模：创建 MySQL CI。</p>
<h4 id="ci">创建 CI</h4>
<p>选择<code>模型管理</code>中选择<code>模型</code>，创建 MySQL 模型。</p>
<p><img alt="-w992" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210408114711.png" /></p>
<h4 id="ci_1">新增 CI 属性</h4>
<p>按照梳理 MySQL CI 属性 中梳理的结果来添加 CI 属性。</p>
<p><img alt="-w1676" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210408125755.png" /></p>
<p>如果手工操作繁琐，也可以导入一个 MySQL 模型示例。</p>
<h4 id="_4">新增唯一校验</h4>
<p>通过<code>实例名</code>可以唯一标识一个 MySQL 实例，具体是<code>IP</code>和<code>端口</code>的组合，所以将 IP 和端口作为一个组合校验。</p>
<p><img alt="-w1676" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210408125841.png" /></p>
<h4 id="ci_2">设立 CI 关联</h4>
<p>针对 MySQL 的管理，除了 CI 属性外，我们同时还关心 MySQL 运行在哪台主机上，所以需要在模型中新建一个“主机上运行 MySQL”的关联。</p>
<p>1 个主机可以运行多个 MySQL 实例，所以<code>源到目标的约束条件</code>为“ 1-N ”</p>
<p><img alt="-w1239" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/16178641731970.png" /></p>
<h3 id="mysql">添加 MySQL 实例</h3>
<p>完成 MySQL CI 的建模之后，接下来添加 MySQL 实例</p>
<h4 id="ci_3">新增或导入 CI 实例</h4>
<p>从 <strong>资源 -&gt; 资源目录</strong>进入 MySQL 实例列表页</p>
<p>点击<strong>新建</strong>按钮，按提示添加 MySQL 实例，也可以批量导入 MySQL 实例。</p>
<p><img alt="-w1399" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210408145717.png" /></p>
<h4 id="ci_4">创建 CI 实例的关联关系</h4>
<p>打开一个 MySQL 实例的详情页，点击<code>关联</code> TAB 中的<code>关联管理</code>，<code>关联</code>当前实例运行在哪台主机上。</p>
<p><img alt="-w1398" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210408145828.png" /></p>
<p>再次点击<code>关联管理</code>，可预览 MySQL 实例与主机的关联关系。</p>
<p><img alt="-w1320" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210408150024.png" /></p>
<p>如果参照本篇教程将<code>机架</code>、<code>交换机</code>、<code>机房管理单元</code>、<code>数据中心</code>等 IT 基础设施均录入 CMDB 中，将可以查询一个 MySQL 实例完整的关联关系。</p>
<p><img alt="-w1397" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210408150251.png" /></p><h1 id="_1">混合云设施管控</h1>
<h2 id="_2">情景</h2>
<p>随着云计算浪潮的推进，多云管控逐渐成为趋势，多云间网络无法互通。</p>
<p>接下来看下蓝鲸是如何管控多云主机。</p>
<h2 id="_3">前提条件</h2>
<ul>
<li><a href="../../../部署指南/产品白皮书/基础包安装/多机部署/quick_install.md">部署完蓝鲸</a></li>
</ul>
<h2 id="_4">术语解释</h2>
<ul>
<li><strong>GSE Server</strong> : <a href="../../..//管控平台/产品白皮书/产品简介/README.md">蓝鲸管控平台</a>的后台服务，由文件分发、命令执行、数据上报三个模块组成。</li>
<li><strong>GSE Proxy</strong> : 跨云网络中，GSE Server 和跨云网络中被管控主机的代理，实现对跨云网络主机的管控。</li>
<li><strong>Agent</strong> : 运行在被管控主机上的代理程序，实现文件分发、命令执行以及数据上报。</li>
<li><strong>VPC</strong> : (Virtual Private Cloud)，私有网络，逻辑隔离的网络空间，每个私有网络内的服务资源内网互通，不同私有网络之间内网不通，但可通过新建<strong>对等连接</strong>来连通。</li>
<li><strong>云区域</strong> : 标识 VPC 网络，蓝鲸多云管控的关键字段，通过 租户 ID( bk_supplier_id )、云区域、IP 三者唯一标识主机。</li>
<li><strong>直连网络</strong> : 蓝鲸后台服务所在的网络，该网络下管控的主机与蓝鲸后台互通。</li>
</ul>
<h2 id="_5">操作步骤</h2>
<ul>
<li>梳理网络拓扑</li>
<li>管理直连网络区域的主机</li>
<li>管理跨云网络区域的主机</li>
</ul>
<h3 id="_6">梳理网络拓扑</h3>
<p>以下是一个经典的多云管控网络拓扑图。</p>
<p>蓝鲸所在的网络为 <code>VPC 1</code> ，通过<code>直连方式</code>管理该网络区域的主机，通过带有外网的 <code>GSE Proxy</code> 来管理公有云的主机（网络为 <code>VPC 2</code> 和 <code>VPC 3</code>）。</p>
<p><img alt="-w1093" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15658731519358.jpg" /></p>
<blockquote>
<p>上图是从管控角度绘制的网络拓扑图。</p>
<p>在跨云管控的场景下，在蓝鲸所在 VPC 1 网络下发安装 Agent 的行为，还需要蓝鲸后台的 <a href="../../../部署指南/产品白皮书/基础包安装/环境准备/get_ready.md">Nginx 模块</a> 具备外网 IP，供 VPC 2 和 VPC 3 网络的 GSE Proxy 下载 Proxy 和 Agent 安装包。</p>
</blockquote>
<h3 id="_7">管理直连网络区域的主机</h3>
<p>先介绍如何管控蓝鲸后台服务所在网络（也称直连网络）的主机。</p>
<h4 id="agent">安装蓝鲸 Agent（直连区域）</h4>
<p>请参考 <a href="../../../节点管理/产品白皮书/QuickStart/DefaultAreaInstallAgent.md">节点管理文档：直连区域 安装 Agent</a></p>
<h4 id="_8">命令执行和分发文件测试</h4>
<p>使用作业平台<code>执行脚本</code>和<code>分发文件</code>做测试。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/blueking_execute_push_file.gif" /></p>
<h3 id="_9">管理跨云网络区域的主机</h3>
<p>接下来介绍，如何管控跨云网络（例如 VPC 2 和 VPC 3）的主机。</p>
<h4 id="agent_1">安装蓝鲸 Agent（自定义云区域）</h4>
<p>请参考 <a href="../../../节点管理/产品白皮书/QuickStart/CustomCloudAreaInstallAgent.md">节点管理文档：自定义云区域 安装 Agent</a></p>
<h4 id="_10">命令执行和分发文件测试</h4>
<p>使用作业平台<code>执行脚本</code>和<code>分发文件</code>做测试。</p>
<p>{% video %}media/bk_nodeman.mp4{% endvideo %}</p>
<h2 id="_11">扩展阅读</h2>
<h3 id="_12">多级级联：管理隔离网络的主机</h3>
<p>在部分企业网络环境中，存在 <code>VPC 1（蓝鲸所处网络）</code> 和 <code>VPC 3</code> 不互通，但需要管控 VPC 3 网络主机的场景，如下图：</p>
<p><img alt="-w1274" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15658731695414.jpg" /></p>
<p>这时候，需要企业网络环境中，存在一个 VPC 2 的网络， 通过申请网络策略，连通 VPC1 和 VPC 3 中的指定（最小策略，安全）服务器。</p>
<p>这时需要使用蓝鲸管控平台的<strong>多级级联</strong>功能， VPC 3 网络中的主机与 GSE Proxy 2 互通，GSE Proxy 2 通过 上联 GSE Proxy 1 与 蓝鲸 GSE Server 通信。</p>
<blockquote>
<p><code>多级级联</code>功能尽请期待。</p>
</blockquote><h1 id="_1">作业平台：批量完成多台服务器的文件分发和脚本检查</h1>
<h2 id="_2">情景</h2>
<p>对运行在多台服务器上的业务服务做新版本的文件分发，自动化的批量快速分发、执行脚本检查新版本文件的 md5。</p>
<h2 id="_3">前提条件</h2>
<ul>
<li>服务器已在 <a href="../CMDB/CMDB_management_hosts.md">CMDB 注册</a></li>
<li>拥有服务器所在 CMDB 中业务的运维权限</li>
</ul>
<h2 id="_4">操作步骤</h2>
<ul>
<li>新建作业</li>
<li>执行和查看执行结果</li>
</ul>
<h3 id="_5">新建作业</h3>
<p>按照新版本发布的需求，我们需要将 <code>newfile.txt</code> 文件推送至 <code>/data/</code> 目录，为了确保万无一失，做 MD5 校验。</p>
<p>作业模板如下：</p>
<p><img alt="test" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/图1.jpg" /></p>
<p>提示：我们配置两个全局变量，“主机列表”类型变量 IP（用于批量给作业步骤传输主机 ip 信息）和“字符串”类型变量 md5（用于进行新版本 md5 的填参）</p>
<p>IP 变量，可以通过“静态 ip 选择”、“动态拓扑选择”、“动态分组选择”和“手动输入”四种方式进行 ip 选择。</p>
<p><img alt="test" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/图2.jpg" /></p>
<p>在步骤中通过选择目标服务器——全局变量——IP 的方式进行有引用。</p>
<p><img alt="test" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/图3.jpg" /></p>
<p>md5 变量，可以在脚本参数中直接使用。</p>
<p><img alt="test" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/图4.jpg" /></p>
<h3 id="_6">设置执行方案</h3>
<p>保存作业后，需要将作业模板设置为一个执行方案，进行全局变量和执行步骤的选择，使其满足该单一场景的使用。该执行方案即可重复使用。</p>
<p><img alt="test" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/图5.jpg" /></p>
<h3 id="_7">执行作业及查看执行结果</h3>
<p>作业执行后，可以查看到执行步骤的进度。</p>
<p><img alt="test" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/图6.jpg" /></p>
<p>每个步骤点击后，可以查看执行详情。切换步骤，可以切换执行详情。</p>
<p><img alt="test" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/图7.jpg" /></p><h1 id="_1">如何实现不同场景的作业编排</h1>
<p>当一个操作场景需要多个步骤串联执行时，如果手工一个个去点击执行，那么效率实在太低了！并且，也没办法很好的沉淀下来，方便后续持续使用和维护。</p>
<p>作业平台的作业管理功能很好的解决了这个问题，用户可以在「作业模板」中配置好相应的执行步骤，然后再根据需求场景衍生对应的「执行方案」；</p>
<p>如此，即清晰的区分开作业模板和实例的关系，避免强耦合关系，也便于后续对使用场景的管理和维护。</p>
<p>具体步骤：</p>
<h2 id="_2">一、创建作业模板</h2>
<ol>
<li>在 <code>作业</code> 页面中，点击 <strong>新建</strong> 进入</li>
</ol>
<p><img alt="image-20201104205455285" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/JOB/https://bkdocs-1252002024.file.myqcloud.com/ZH/6.0/%E4%BD%9C%E4%B8%9A%E5%B9%B3%E5%8F%B0/%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6/Quick-Starts/media/image-20201104205455285.png" /></p>
<ol>
<li>按照表单中的要求输入作业的基础信息，和步骤内容</li>
</ol>
<p><img alt="image-20200407170537403" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/JOB/https://bkdocs-1252002024.file.myqcloud.com/ZH/6.0/%E4%BD%9C%E4%B8%9A%E5%B9%B3%E5%8F%B0/%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6/Quick-Starts/media/image-20200407170537403.png" /></p>
<ol>
<li>设置 一个<code>name</code> 字符串，和 <code>target</code> 的主机列表变量，提供作业步骤中使用</li>
</ol>
<p>创建 <code>主机列表</code> 变量：</p>
<p><img alt="image-20200407170400057" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/JOB/https://bkdocs-1252002024.file.myqcloud.com/ZH/6.0/%E4%BD%9C%E4%B8%9A%E5%B9%B3%E5%8F%B0/%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6/Quick-Starts/media/image-20200407170400057.png" /></p>
<p>创建 <code>字符串</code> 变量：</p>
<p><img alt="image-20200407170918316" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/JOB/https://bkdocs-1252002024.file.myqcloud.com/ZH/6.0/%E4%BD%9C%E4%B8%9A%E5%B9%B3%E5%8F%B0/%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6/Quick-Starts/media/image-20200407170918316.png" /></p>
<ol>
<li>添加执行步骤，有[执行脚本]、[分发文件]、人工确认]三个类型</li>
</ol>
<p>这里我们添加三个步骤：</p>
<p>步骤一、分发本地文件</p>
<p><img alt="image-20210421114851834" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/image-20210421114851834.png" /></p>
<p>步骤二、脚本执行，直接写临时脚本,也可以引用已有脚本，用上全局变量 <code>name</code></p>
<p><img alt="image-20200407171444377" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/JOB/https://bkdocs-1252002024.file.myqcloud.com/ZH/6.0/%E4%BD%9C%E4%B8%9A%E5%B9%B3%E5%8F%B0/%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6/Quick-Starts/media/image-20200407171444377.png" /></p>
<p>步骤三、加个人工确认步骤，演示一下</p>
<p><img alt="image-20200407171536319" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/JOB/https://bkdocs-1252002024.file.myqcloud.com/ZH/6.0/%E4%BD%9C%E4%B8%9A%E5%B9%B3%E5%8F%B0/%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6/Quick-Starts/media/image-20200407171536319.png" /></p>
<ol>
<li>最后点击 <code>提交</code> 按钮，保存作业模板；至此，作业模板就创建完毕</li>
</ol>
<p><img alt="image-20200407171643379" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/JOB/https://bkdocs-1252002024.file.myqcloud.com/ZH/6.0/%E4%BD%9C%E4%B8%9A%E5%B9%B3%E5%8F%B0/%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6/Quick-Starts/media/image-20200407171643379.png" /></p>
<h2 id="_3">二、创建执行方案</h2>
<p>作业「执行方案」是由模板衍生出来的实体对象，不同的执行方案通常用于面向不同的使用场景</p>
<ol>
<li>进入刚才创建的作业模板，并点击 <code>选择方案</code> 前往创建或查看执行方案</li>
</ol>
<p><img alt="image-20200407172705035" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/JOB/https://bkdocs-1252002024.file.myqcloud.com/ZH/6.0/%E4%BD%9C%E4%B8%9A%E5%B9%B3%E5%8F%B0/%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6/Quick-Starts/media/image-20200407172705035.png" /></p>
<ol>
<li>点击「新建执行方案」来创建一个全新的作业执行方案</li>
</ol>
<p><img alt="image-20200407172907623" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/JOB/https://bkdocs-1252002024.file.myqcloud.com/ZH/6.0/%E4%BD%9C%E4%B8%9A%E5%B9%B3%E5%8F%B0/%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6/Quick-Starts/media/image-20200407172907623.png" /></p>
<ol>
<li>提交保存后，即可在列表中看到刚刚创建的执行方案</li>
</ol>
<p><img alt="image-20200407172941308" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/JOB/https://bkdocs-1252002024.file.myqcloud.com/ZH/6.0/%E4%BD%9C%E4%B8%9A%E5%B9%B3%E5%8F%B0/%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6/Quick-Starts/media/image-20200407172941308.png" /></p>
<h2 id="_4">三、执行作业</h2>
<ol>
<li>从刚才创建的执行方案页面中，点击「<strong>去执行</strong>」来触发执行动作</li>
</ol>
<p><img alt="image-20200407195149316" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/JOB/https://bkdocs-1252002024.file.myqcloud.com/ZH/6.0/%E4%BD%9C%E4%B8%9A%E5%B9%B3%E5%8F%B0/%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6/Quick-Starts/media/image-20200407195149316.png" /></p>
<ol>
<li>执行前，还可以根据自己的需求场景来修改全局变量的值</li>
</ol>
<p><img alt="image-20200407195351347" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/JOB/https://bkdocs-1252002024.file.myqcloud.com/ZH/6.0/%E4%BD%9C%E4%B8%9A%E5%B9%B3%E5%8F%B0/%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6/Quick-Starts/media/image-20200407195351347.png" /></p>
<ol>
<li>全局变量的值确认后，点击「<strong>执行</strong>」即可进入执行总览页面：</li>
</ol>
<p><img alt="image-20200407200026973" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/JOB/https://bkdocs-1252002024.file.myqcloud.com/ZH/6.0/%E4%BD%9C%E4%B8%9A%E5%B9%B3%E5%8F%B0/%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6/Quick-Starts/media/image-20200407200026973.png" /></p>
<ol>
<li>点击单个步骤可查看该步骤的执行详情</li>
</ol>
<p><img alt="image-20200407200229158" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/JOB/https://bkdocs-1252002024.file.myqcloud.com/ZH/6.0/%E4%BD%9C%E4%B8%9A%E5%B9%B3%E5%8F%B0/%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6/Quick-Starts/media/image-20200407200229158.png" /></p><h1 id="_1">标准运维：一次标准的应用交付自动化案例</h1>
<h2 id="_2">情景</h2>
<p>应用发布是运维这个岗位的职能之一，发布关联多个 ITIL 系统的功能模块，比如发布单、监控的告警屏蔽、DB 变更、业务内公告、统一登录入口等，频繁在多个系统间切换，不但影响效率而且容易出错，同时无法可视化查看发布进度以及事后的回溯。</p>
<p>接下来，一起看下标准运维是如何解决这些痛点。</p>
<h2 id="_3">前提条件</h2>
<ul>
<li><a href="../CMDB/CMDB_management_hosts.md">CMDB 如何管理主机</a></li>
</ul>
<h2 id="_4">术语解释</h2>
<ul>
<li><strong>流程模板</strong> : 标准化的资源和应用交付模式，通过资源编排引擎，实现对资源的创建、配置，实现自动化交付资源或应用，行业中一般称之为<code>pipeline</code>、<code>资源编排模板</code>，比如一次发布任务可以编排为一个流程模板。</li>
<li><strong>标准插件</strong> : 多个执行节点通过编排规则实现流程模板，其中的执行节点称之为 标准插件，比如<code>执行脚本</code>为一个标准插件</li>
</ul>
<p>更多详见 <a href="../../../标准运维/产品白皮书/术语解释/glossary.md">术语定义</a></p>
<h2 id="_5">操作步骤</h2>
<ul>
<li>梳理：梳理标准化模板</li>
<li>建模：新建流程模板</li>
<li>执行：执行流程</li>
</ul>
<h3 id="_6">梳理标准化模板</h3>
<p>配置管理标准化中提到，运维服务“四化建设”的标准化包含配置管理、发布、变更、故障处理、监控告警等场景的流程制定。以发布为例，通过流程图梳理应用交付的流程。</p>
<p>分为发布前准备、发布中、发布后检查三部分。</p>
<p><img alt="应用交付自动化" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/应用交付自动化-1.png" /></p>
<h3 id="_7">创建流程模板</h3>
<p>为了简化演示，将流程图中的关键节点在标准运维的业务流程模板中体验出来。</p>
<p>选择<code>[流程模板]</code> -&gt; <code>[业务流程]</code>，点击<code>新建</code>来创建业务流程模板。</p>
<p>从左侧标准插件区，选择发布流程中需要的标准插件作为流程的节点，比如<code>执行作业</code>, 向右拖动到画布。</p>
<p><img alt="-w1606" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15644736844126.jpg" /></p>
<p>选择作业平台中准备好的 <code>作业模板</code>，然后新建 <code>全局变量</code>，并将全局变量填充到节点的参数中。</p>
<p><img alt="-w1603" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15644771226551.jpg" /></p>
<p>按照上述步骤，完成一个应用发布的流程模板。</p>
<p><img alt="-w1606" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15644773728491.jpg" /></p>
<blockquote>
<p>标准运维内置了 CMDB、作业平台、通知等标准组件，如果不在此列的，需要开发标准运维插件来 集成企业内部 ITIL 系统。</p>
</blockquote>
<p>这里重点说明 <code>全局参数</code> 和 <code>流程分支</code>。</p>
<h4 id="_8">全局参数</h4>
<p>服务器发生故障后，保障下一次应用发布获取最新的 IP 列表，可以通过 IP 选择器实现。</p>
<p><img alt="-w1602" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15644781544003.jpg" /></p>
<h4 id="_9">流程分支</h4>
<p>应用发布过程中，执行成功 和 执行失败的处理分支不同，可以通过流程分支功能对上一步执行结果为真或为假来判断。</p>
<p><img alt="-w1173" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15644783233169.jpg" /></p>
<p>提前引用上一步流程节点的输出参数<code>执行结果</code>，将其用于上图中的流程分支表达式。</p>
<p><img alt="-w1127" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15644782523637.jpg" /></p>
<h3 id="_10">执行流程</h3>
<p>在业务流程列表中，点击<code>新建任务</code></p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15638818330008.jpg" /></p>
<p>点击执行任务流程</p>
<p>{% video %}media/sops_execution.mp4{% endvideo %}</p>
<h2 id="_11">扩展阅读</h2>
<h3 id="_12">上下文传参</h3>
<p>将一个流程节点的输出作为另一个流程节点的输入。</p>
<p>比如第 1 步输出 MD5 值 ，第 2 步分发版本，第 3 步使用第 1 步中生成的 MD5 值 来校验版本的一致性，效果如下：</p>
<p><img alt="-w1486" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15616298718559.jpg" /></p>
<p>主要用到标准运维流程节点中的 <strong>引用输出参数</strong>，引用第 1 步中的 <code>release_md5</code> 变量。</p>
<p><img alt="-w1641" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15616299242595.jpg" /></p>
<p><code>release_md5</code>变量需要提前在作业模板中设置，如下图：</p>
<p><img alt="-w1417" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15644779332012.jpg" /></p>
<p><img alt="-w1274" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15629369392955.jpg" /></p><h1 id="_1">标准运维：操作员做应用交付，让运维更专注</h1>
<h2 id="_2">情景</h2>
<p>应用交付虽然做到了自动化，但运维仍需和周边团队跟进流程，耗费大量时间，此时通过 <a href="../../../标准运维/产品白皮书/产品简介/README.md">标准运维</a> <code>职能化</code> 的能力将应用交付的流程，转移给操作员执行。</p>
<p>运维 <code>blueking</code> 提交一个应用发布的职能化任务给到 <code>caozuo(操作员A）</code>，<code>caozuo(操作员A)</code> 执行任务，跟进任务执行的进展。</p>
<h2 id="_3">前提条件</h2>
<ul>
<li>在标准运维中 <a href="../../../标准运维/产品白皮书/产品功能/flow.md">建立一个流程</a></li>
<li>准备两个角色：<code>运维</code> 和  <a href="../../../PaaS平台/产品白皮书/产品功能/系统管理/UserManageEE.md">职能化(操作员)</a></li>
</ul>
<h2 id="_4">操作步骤</h2>
<ul>
<li>准备职能化角色</li>
<li>运维发起职能化任务流程</li>
<li>职能化认领任务</li>
</ul>
<h3 id="_5">准备职能化角色</h3>
<p>在<code>用户管理</code>中新增<code>职能化账户</code>，如<code>操作员A</code></p>
<p>将其添加至业务的<code>操作人员</code>角色中</p>
<p><img alt="-w1358" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15626757873636.jpg" /></p>
<p>在标准运维的<code>业务流程</code>中给<code>职能化</code>授权</p>
<p><img alt="-w1678" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15626655943347.jpg" /></p>
<h3 id="_6">运维发起职能化任务流程</h3>
<p>运维选择一个应用发布流程，点击<code>新建任务</code>，选择<code>职能化任务流程</code></p>
<p><img alt="-w1673" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15626651187357.jpg" /></p>
<h3 id="_7">职能化认领任务</h3>
<p>用<code>操作员A</code>的角色访问标准运维，在<code>职能化中心</code>中认领刚才新建的<code>职能化任务</code></p>
<p><img alt="-w1484" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15626652375328.jpg" /></p>
<p>如果不需要修改参数，点击<code>认领</code>即可</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15626653433243.jpg" /></p>
<p>点击<code>执行</code>按钮</p>
<p><img alt="-w1666" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15626726352252.jpg" /></p>
<p>可以看到任务执行的状态</p>
<p>{% video %}media/stag_delivery.mp4{% endvideo %}</p>
<p>在<code>职能化中心</code>可以看到任务已经执行完成。</p>
<p><img alt="-w1433" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15627514845867.jpg" /></p>
<p>对应运维视角，也可以看到任务已执行完成。</p>
<p><img alt="-w1589" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15627516202535.jpg" /></p>
<p>如此，运维可以把日常的应用发布需求提交给操作员执行，释放自己，把精力多放在<code>运维服务目录输出</code>以及<code>业务优化</code>上。</p>
<h2 id="_8">扩展阅读: 设置任务执行者</h2>
<p>操作员执行任务流程时，标准运维从<code>任务执行者</code>字段获取运维人员列表，如果不填，则为该业务的随机运维人员。</p>
<p><img alt="-w1349" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/20210408175157.png" /></p><h1 id="itsm">ITSM：服务器资源申请流程线上化</h1>
<h2 id="_1">情景</h2>
<p>传统的资源申请是 <strong>通过邮件</strong>，沟通成本太高，而且无法回溯。</p>
<p>新业务上线，需要申请几台服务器用于部署应用。接下来，看蓝鲸 ITSM 是如何 <strong>实现服务器申请的流程线上化</strong>。</p>
<h2 id="_2">前提条件</h2>
<ul>
<li>蓝鲸企业版，自带 ITSM SaaS。</li>
<li>准备 1 个 管理员账号，用于<strong>流程设计</strong>；1 个运维账号用于<strong>资源申请</strong> ，1 个 <a href="../../../PaaS平台/产品白皮书/产品功能/系统管理/UserManageEE.md">普通账号</a> <code>SA</code> 用于<strong>审批和交付资源</strong>。</li>
</ul>
<h2 id="_3">操作步骤</h2>
<ul>
<li>梳理资源申请流程</li>
<li>创建资源申请服务目录及流程</li>
<li>一次资源申请示例</li>
</ul>
<h3 id="_4">梳理资源申请流程</h3>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657805498419.jpg" /></p>
<blockquote>
<p>流程图中是一个实践案例，部分数据需要从周边系统获取，此处功能需要做二次开发，本教程专注流程本身。</p>
</blockquote>
<h3 id="_5">创建资源申请服务目录及流程</h3>
<p>先设计资源申请的<strong>流程</strong>，<strong>流程依附在服务目录上对外提供服务</strong>。</p>
<h4 id="_6">角色设置</h4>
<p>使用蓝鲸管理员账号给该业务<strong>分配运维人员的角色</strong>。</p>
<p><img alt="-w1406" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657827837142.jpg" /></p>
<p>使用管理员账号<strong>新增通用角色</strong> SA ，并添加用户 sa_zhang（该账户是前提条件中准备的）。</p>
<p><img alt="-w1489" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15653338148649.jpg" /></p>
<h4 id="_7">设计资源申请流程</h4>
<h5 id="_8">填写流程信息</h5>
<p>选择菜单【流程设计】 ，点击【新增】按钮，按提示填写流程信息。</p>
<p><img alt="-w1278" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15653287159233.jpg" /></p>
<p>流程类型选择【请求】，需要【关联业务】，因为资源申请和业务相关，资源管理员需要知道将资源分配给哪个业务。</p>
<p>点击【下一步】，进入【定义与配置流程】环节。</p>
<h5 id="_9">定义与配置流程</h5>
<p><img alt="-w1404" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657835995889.jpg" /></p>
<p>点击上图【流程画布】中的【齿轮】，配置【提单】流程节点的字段。</p>
<p>一般是业务的<strong>运维</strong>提服务器资源申请的单据，所以操作角色选择【CMDB 业务公用角色】-&gt; 【运维人员】。</p>
<p><img alt="-w1400" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657837227373.jpg" /></p>
<p>点击【新增字段】，参照 <strong>梳理资源申请流程</strong> ，新增每个环节中需要的字段。</p>
<p><img alt="-w1401" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657838719444.jpg" /></p>
<p>参照 <strong>梳理资源申请流程</strong>，完成整个服务器申请流程的配置。</p>
<p><img alt="-w1397" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657840311702.jpg" /></p>
<h5 id="_10">启用流程</h5>
<p>【启用流程】，选择适合的通知策略，点击【提交】完成流程设计。</p>
<p><img alt="-w1400" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657840684184.jpg" /></p>
<h5 id="_11">流程模板实例化</h5>
<p>选择菜单【流程设计】，找到刚编辑的申请服务器流程，点击【部署】，生成流程实例。</p>
<p><img alt="-w1398" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657841898867.jpg" /></p>
<h4 id="_12">在服务目录中新增 "申请服务器" 服务，并绑定流程</h4>
<p>选择菜单【服务】，点击【新增】按钮，新增"申请服务器"服务，并 <strong>关联</strong> 刚生成的流程实例。</p>
<p><img alt="-w1399" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657842891310.jpg" /></p>
<p>选择菜单【服务目录】，选中【根目录】，点击右侧【 <strong>⋮</strong> 】，点击【新增】，按提示新增一个名为 <strong>基础设施资源</strong> 的服务目录，然后在 <strong>基础设施资源</strong> 下新建一个 <strong>计算资源</strong> 的服务目录。</p>
<p><img alt="-w1400" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657845850831.jpg" /></p>
<p>选中刚刚创建的服务目录【计算资源】，右侧会显示【添加】按钮，点击该按钮添加 <strong>申请服务器</strong> 服务。</p>
<p><img alt="-w1399" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657846326931.jpg" /></p>
<h3 id="_13">一次资源申请示例</h3>
<p>创建完"申请服务器"流程及服务目录后，接下来做一次<strong>服务器申请</strong>演示。</p>
<p><img alt="-w799" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657847596993.jpg" /></p>
<h4 id="_14">运维提单申请服务器</h4>
<p>用<code>运维</code>账号登录 ITSM ，选择【请求管理】菜单，点击【新增请求】，选择【申请服务器】服务，点击【提交】。</p>
<p><img alt="-w1390" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15653317491334.jpg" /></p>
<p>在申请服务器的提单界面，填写服务器申请的关键信息：关联业务、期望交付时间以及服务器的配置和地域。为了安全起见，逻辑层和存储层一般不需要外网 IP。</p>
<p>点击【提交】，创建服务器申请需求。</p>
<p><img alt="-w1648" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657856231015.jpg" /></p>
<blockquote>
<p>注：点击【保存模板】可以记录提单环节的关键信息，下次提单只需修改少部分字段即可。</p>
</blockquote>
<h4 id="sa">SA 审批单据</h4>
<p>SA 收到一封<strong>待处理</strong>的<strong>服务器申请</strong>邮件。</p>
<p><img alt="-w901" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657858051061.jpg" /></p>
<p>使用 SA 账号登录 ITSM ，在待办列表中，找到一个刚刚运维提交的服务器申请单据。</p>
<p><img alt="-w1679" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657859619643.jpg" /></p>
<p>点击链接，同时在周边系统查看该业务的低负载指标，确认达标，点击【通过】，完成本环节流程。</p>
<p><img alt="-w1662" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657862481388.jpg" /></p>
<blockquote>
<p>低负载指标：CPU、内存、网络等指标是否长期处于一个很低的水平，如果是的话，证明计算资源利用率低，SA 一般不予通过资源申请。</p>
</blockquote>
<h4 id="_15">交付服务器</h4>
<p>SA 创建资源，并录入到【交付服务器】环节的服务器配置中。</p>
<p><img alt="-w1662" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657865788372.jpg" /></p>
<p>至此，服务器申请流程结束。</p>
<p>运维登录 ITSM，即可查看申请的服务器资源。</p>
<p><img alt="-w1630" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657866472778.jpg" /></p><h1 id="itsm">ITSM：发布流程线上化</h1>
<h2 id="_1">情景</h2>
<p>应用发布是运维的职能之一，传统的应用发布通过邮件交付，沟通成本太高，而且不符合合规性检查。</p>
<p>接下来，以<strong>一个业务的应用发布为例</strong>，看蓝鲸 ITSM 是如何解决这个痛点的。</p>
<h2 id="_2">前提条件</h2>
<ul>
<li>蓝鲸企业版，自带 ITSM SaaS。</li>
<li>准备发布流程中的 <a href="../../../PaaS平台/产品白皮书/产品功能/系统管理/UserManageEE.md">各个角色</a> 的账号，包含流程设计的<code>管理员</code>，以及应用发布流程中的<code>产品</code>、<code>运维</code>、<code>测试</code>、<code>QC</code>。</li>
</ul>
<h2 id="_3">操作步骤</h2>
<ul>
<li>梳理应用发布流程</li>
<li>创建应用发布服务目录及流程</li>
<li>一次应用发布示例</li>
</ul>
<h3 id="_4">梳理应用发布流程</h3>
<p>从 ITSM 理论出发，梳理一个应用发布流程图，<strong>将测试环境验收通过的版本，部署到生产环境</strong>。包含研发运营环节的<strong>测试</strong>、产品<strong>提交发布需求</strong>、运维<strong>协调发布资源</strong>、<strong>发布</strong>，以及最后质量保证(QA)对应用<strong>发布质量的管理</strong>。</p>
<p><img alt="-w1506" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15659242689054.jpg" /></p>
<blockquote>
<p>流程图中是一个实践案例，部分数据需要从周边系统获取，此处功能需要做二次开发，本教程专注流程本身。</p>
</blockquote>
<h3 id="_5">创建"应用发布"流程及服务目录</h3>
<p>先设计应用发布的<strong>流程</strong>，<strong>流程依附在服务目录上对外提供服务</strong>。</p>
<h4 id="_6">角色设置</h4>
<p>使用蓝鲸管理员账号给该业务<strong>分配对应角色的权限</strong>。</p>
<p><img alt="-w1347" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657677924105.jpg" /></p>
<p>使用管理员账号<strong>新增通用角色</strong> QC ，并添加用户 qc_c（该账户是前提条件中准备的）。</p>
<p><img alt="-w1356" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657673907984.jpg" /></p>
<h4 id="_7">设计应用发布流程</h4>
<h5 id="_8">填写流程信息</h5>
<p>选择菜单【流程设计】 ，点击【新增】按钮，按提示填写流程信息。</p>
<p><img alt="-w1357" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657675913906.jpg" /></p>
<p>流程类型选择【变更】，需要【关联业务】，因为应用发布和业务相关，同时关联业务对应的角色：产品、运维、测试。</p>
<p>点击【下一步】，进入【定义与配置流程】环节。</p>
<h5 id="_9">定义与配置流程</h5>
<p><img alt="-w1612" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657687519024.jpg" /></p>
<p>点击上图【流程画布】中的【齿轮】，配置【提单】流程节点的字段。</p>
<p>一般是业务的<strong>产品</strong>提应用的发布单据，所以操作角色选择【CMDB 业务公用角色】-&gt; 【产品人员】。</p>
<p><img alt="-w1614" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657685179459.jpg" /></p>
<p>点击【新增字段】，参照 <strong>梳理应用发布流程</strong>，新增每个环节中需要的字段。</p>
<p><img alt="-w1616" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657684206630.jpg" /></p>
<p>参照 <strong>梳理应用发布流程</strong>，完成整个应用发布流程的配置。</p>
<p><img alt="-w1603" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657693304263.jpg" /></p>
<h5 id="_10">启用流程</h5>
<p>【启用流程】，选择适合的通知策略，点击【提交】完成流程设计。</p>
<p><img alt="-w1610" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657700705257.jpg" /></p>
<h5 id="_11">流程模板实例化</h5>
<p>选择菜单【流程设计】，找到刚编辑的应用发布流程，点击【部署】，生成流程实例。</p>
<p><img alt="-w1608" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657714512813.jpg" /></p>
<h4 id="_12">在服务目录中新增"应用发布"服务，并绑定流程</h4>
<p>选择菜单【服务】，点击【新增】按钮，新增"应用发布"服务，并<strong>关联</strong>刚生成的流程实例。</p>
<p><img alt="-w1610" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657715921795.jpg" /></p>
<p>选择菜单【服务目录】，选中【根目录】，点击右侧【 <strong>⋮</strong> 】，点击【新增】，按提示新增一个名为<strong>应用发布</strong>的服务目录。</p>
<p><img alt="-w1602" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657716914488.jpg" /></p>
<p>选中刚刚创建的服务目录【应用发布】，右侧会显示【添加】按钮，点击该按钮添加<strong>应用发布</strong>服务。</p>
<p><img alt="-w1613" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657718206864.jpg" /></p>
<h3 id="_13">一次应用发布示例</h3>
<p>创建完"应用发布"流程及服务目录后，接下来做<strong>一次应用发布演示</strong>。</p>
<p><img alt="-w723" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657727131323.jpg" /></p>
<h4 id="_14">产品提交发布需求</h4>
<p>用<code>产品</code>账号登录 ITSM ，选择【变更管理】菜单，点击【新增变更】，选择【应用发布】服务，点击【提交】。</p>
<p><img alt="-w1661" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657728020743.jpg" /></p>
<p>在变更申请界面，填写<strong>本次版本发布的关键信息</strong>，包括版本包路径、MD5 ，用于自动化应用发布系统直接从仓库中获取版本，以及版本发布范围和时间。</p>
<p>点击【提交】，创建发布需求。</p>
<p><img alt="-w1628" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657735354575.jpg" /></p>
<h4 id="_15">测试确认版本质量</h4>
<p>测试人员收到一封<strong>待处理</strong>的<strong>测试确认</strong>邮件。</p>
<p><img alt="-w913" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657747653730.jpg" /></p>
<p>使用测试账号登录 ITSM ，在待办列表中，找到刚刚产品提的发布单。</p>
<p><img alt="-w1677" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657591451663.jpg" /></p>
<p>点击链接，选择评估结果和测试结果，并填写测试概况，点击【通过】，完成本环节流程。</p>
<p><img alt="-w1678" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657591950680.jpg" /></p>
<p><img alt="-w1665" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657593296906.jpg" /></p>
<h4 id="_16">运维协调资源</h4>
<p>使用运维的账号登录 ITSM，在待办列表找到单据。</p>
<p><img alt="-w1663" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657594541620.jpg" /></p>
<p>点击【通过】，开始协调发布资源，做好发布准备。</p>
<p><img alt="-w1661" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657594759068.jpg" /></p>
<h4 id="_17">运维实施发布</h4>
<p>完成了发布准备，到了计划发布时间，在自动化应用发布系统（如标准运维）上完成应用发布后，在该发布单的运维发布环节填写<strong>本次运维发布的概况</strong>。</p>
<p><img alt="-w1657" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657596113646.jpg" /></p>
<h4 id="qc">QC 发布评估</h4>
<p>QC（质量保障）人员在工作台的待办列表中，找到本次发布的单据。</p>
<p><img alt="-w1677" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657596783221.jpg" /></p>
<p>QC 根据业务指标监控系统的数据以及事件管理中是否存在关联的事件，对此次发布做出发布评估。</p>
<p><img alt="-w1672" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657597517613.jpg" /></p>
<p>至此，一次应用发布的流程结束。</p>
<p><img alt="-w1671" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15657664966934.jpg" /></p><h1 id="itsm">ITSM：环境变更流程线上化</h1>
<h2 id="_1">情景</h2>
<p>变更是运维的职能之一，包含应用的配置、基础设施的环境等变更。</p>
<p>应用所依赖的服务器已经服役 5 年，不在维保期限，故障率抖升，为了保障应用的稳定性，运维团队计划在业务低峰期，完成服务器的以旧换新。</p>
<p>ITSM 中的变更管理（Change Managent）规范了变更环节的操作，确保<strong>高效有序的完成环境变更</strong>，对应用的可用性负责，并对生产环境的变更满足<strong>合规性检查</strong>。</p>
<p>变更管理是蓝鲸 ITSM 的一个模块，接下来介绍在蓝鲸 ITSM 如何<strong>完成这次服务器的替换升级</strong>。</p>
<h2 id="_2">前提条件</h2>
<ul>
<li>蓝鲸企业版，自带 ITSM SaaS。</li>
<li>准备环境变更流程中 <a href="../../../PaaS平台/产品白皮书/产品功能/系统管理/UserManageEE.md">多个角色</a> 的账号，包含<code>运维</code>、<code>QC</code>、<code>产品</code>，以及流程设计的<code>管理员</code>。</li>
</ul>
<h2 id="_3">操作步骤</h2>
<ul>
<li>梳理环境变更流程</li>
<li>创建环境变更服务目录及流程</li>
<li>一次环境变更示例</li>
</ul>
<h3 id="_4">梳理环境变更流程</h3>
<p>从 ITSM 理论出发，梳理<strong>环境变更流程图</strong>，包含运维<strong>变更申请</strong>、<strong>受理变更</strong>、<strong>变更操作和总结</strong>，以及最后质量保证（QC）对变更的<strong>评估管理</strong>。</p>
<p><img alt="-w1274" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15659272273490.jpg" /></p>
<blockquote>
<p>流程图中是一个实践案例，部分数据需要从周边系统获取，此处功能需要做二次开发，本教程专注流程本身。</p>
</blockquote>
<h3 id="_5">创建环境变更服务目录及流程</h3>
<p>先设计环境变更的<strong>流程</strong>，<strong>流程依附在服务目录上对外提供服务</strong>。</p>
<h4 id="_6">角色设置</h4>
<p>参照 <a href="./Release_Management.md">角色设置</a> 完成对<code>运维</code>、<code>产品</code>和<code>QC</code>的授权。</p>
<h4 id="_7">设计环境变更流程</h4>
<h5 id="_8">填写流程信息</h5>
<p>选择菜单【流程设计】 ，点击【新增】按钮，按提示填写流程信息。</p>
<p><img alt="-w1338" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658666453759.jpg" /></p>
<p>流程类型选择【变更】，需要【关联业务】，因为<strong>环境变更和业务相关</strong>，同时关联业务对应的角色：产品、运维。</p>
<p>点击【下一步】，进入【定义与配置流程】环节。</p>
<h5 id="_9">定义与配置流程</h5>
<p><img alt="-w1337" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658667483286.jpg" /></p>
<p>点击上图【流程画布】中的【齿轮】，配置【提单】流程节点的字段。</p>
<p>一般是<strong>运维</strong>提环境变更单据，所以操作角色选择【CMDB 业务公用角色】-&gt; 【运维人员】(角色授权详见给角色分配权限 ）。</p>
<p><img alt="-w1335" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658668218721.jpg" /></p>
<p>点击【新增字段】，参照 <strong>梳理环境变更流程</strong>，新增每个环节中需要的字段。</p>
<p><img alt="-w1285" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658670592201.jpg" /></p>
<p>参照 <strong>梳理环境变更流程</strong>，，完成整个环境变更流程的配置。</p>
<p><img alt="-w1517" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658682086636.jpg" /></p>
<h5 id="_10">启用流程</h5>
<p>【启用流程】，选择适合的通知策略，点击【提交】完成流程设计。</p>
<p><img alt="-w1522" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658682459451.jpg" /></p>
<h5 id="_11">流程模板实例化</h5>
<p>选择菜单【流程设计】，找到刚编辑的环境变更流程，点击【部署】，生成流程实例。</p>
<p><img alt="-w1522" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658682863006.jpg" /></p>
<h4 id="_12">在服务目录中新增"环境变更"服务，并绑定流程</h4>
<p>选择菜单【服务】，点击【新增】按钮，新增"环境变更"服务，并<strong>关联</strong>刚生成的流程实例。</p>
<p><img alt="-w1522" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658687042752.jpg" /></p>
<p>选择菜单【服务目录】，选中【根目录】，点击右侧【 <strong>⋮</strong> 】，点击【新增】，按提示新增一个名为<strong>环境变更</strong>的服务目录。</p>
<p><img alt="-w1523" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658688170167.jpg" /></p>
<p>选中刚刚创建的服务目录【环境变更】，右侧会显示【添加】按钮，点击该按钮添加<strong>环境变更</strong>服务。</p>
<p><img alt="-w1522" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658688910183.jpg" /></p>
<p>至此，<strong>流程设计和服务目录已新建好</strong>，接下来做一次环境变更演示。</p>
<h3 id="_13">一次环境变更示例</h3>
<p><img alt="-w776" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658720001516.jpg" /></p>
<h4 id="_14">运维：变更申请</h4>
<p>用<code>运维</code>账号登录 ITSM ，选择【变更管理】菜单，点击【新增变更】，选择【环境变更】服务，点击【提交】。</p>
<p><img alt="-w1574" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658690314017.jpg" /></p>
<p>在【新增变更】界面，填写<strong>本次环境变更的关键信息</strong>，包括变更原因、范围以及时间等。</p>
<p>点击【提交】，完成变更申请。</p>
<p><img alt="-w1510" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658696903972.jpg" /></p>
<h4 id="_15">运维组长：变更审核</h4>
<p>运维组长收到一封<strong>待处理</strong>的<strong>变更审核</strong>邮件。</p>
<p><img alt="-w997" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658700619796.jpg" /></p>
<p>使用<strong>运维</strong>账号登录 ITSM ，在待办列表中，找到待处理的环境变更单。</p>
<p><img alt="-w1510" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658697525323.jpg" /></p>
<p>点击链接，审核本次变更，点击【通过】，完成本环节流程。</p>
<p><img alt="-w1502" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658697806146.jpg" /></p>
<h4 id="_16">运维：变更操作及总结</h4>
<p>环境变更完毕后，填写变更总结。</p>
<p><img alt="-w1502" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658698294902.jpg" /></p>
<h4 id="qc">QC：变更评估</h4>
<p>QC（质量保障）人员在工作台的待办列表中，找到本次环境变更的单据。</p>
<p><img alt="-w1512" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658698912944.jpg" /></p>
<p>QC 依据该业务的业务关键指标数据、投诉情况，做出<strong>变更评估</strong>。</p>
<p><img alt="-w1522" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658699278776.jpg" /></p>
<p>至此，一次<strong>环境变更的流程结束</strong>。</p>
<p><img alt="-w1666" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658699768290.jpg" /></p><h1 id="itsm">ITSM：故障提报流程线上化</h1>
<h2 id="_1">情景</h2>
<p>ITSM 中的故障管理(Incident Management)帮企业构建了一套<strong>应对故障的处理机制</strong>，确保故障来临之时可以<strong>高效有序的响应、处理以及回溯故障的表面和本质</strong>，并将根源问题通过转单到<strong>问题管理模块</strong>，实现<strong>故障的闭环</strong>。</p>
<p>故障管理是蓝鲸 ITSM 内置的模块之一，接下来介绍在蓝鲸 ITSM 是如何应对<strong>部分地区用户集中无法访问网站的投诉</strong>。</p>
<h2 id="_2">前提条件</h2>
<ul>
<li>蓝鲸企业版，自带 ITSM SaaS。</li>
<li>准备故障提报流程中 <a href="../../../PaaS平台/产品白皮书/产品功能/系统管理/UserManageEE.md">多个角色</a> 的账号，包含<code>运维</code>、<code>QC</code>、<code>产品</code>，以及流程设计的<code>管理员</code>。</li>
</ul>
<h2 id="_3">操作步骤</h2>
<ul>
<li>梳理故障提报流程</li>
<li>创建故障提报服务目录及流程</li>
<li>一次故障提报示例</li>
</ul>
<h3 id="_4">梳理故障提报流程</h3>
<p>从 ITSM 理论出发，梳理故障提报的流程图，包含客服 <strong>提单</strong>、运维 <strong>故障跟进</strong>、运维 <strong>回溯总结故障</strong>，以及最后质量保证(QC)对故障的 <strong>评估管理</strong>。</p>
<p><img alt="-w1458" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658530577275.jpg" /></p>
<blockquote>
<p>流程图中是一个实践案例，部分数据需要从周边系统获取，此处功能需要做二次开发，本教程专注流程本身。</p>
</blockquote>
<h3 id="_5">创建故障提报服务目录及流程</h3>
<p>先设计故障提报的<strong>流程</strong>，<strong>流程依附在服务目录上对外提供服务</strong>。</p>
<h4 id="_6">角色设置</h4>
<p>参照 <a href="./Release_Management.md">角色设置</a> 完成对<code>运维</code>、<code>产品</code>和<code>QC</code>的授权。</p>
<h4 id="_7">设计故障受理流程</h4>
<h5 id="_8">填写流程信息</h5>
<p>选择菜单【流程设计】 ，点击【新增】按钮，按提示填写流程信息。</p>
<p><img alt="-w1362" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658545362420.jpg" /></p>
<p>流程类型选择【事件】，需要【关联业务】，因为故障提报和业务相关，同时关联业务对应的角色：产品、运维。</p>
<p>点击【下一步】，进入【定义与配置流程】环节。</p>
<h5 id="_9">定义与配置流程</h5>
<p><img alt="-w1352" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658547862596.jpg" /></p>
<p>点击上图【流程画布】中的【齿轮】，配置【提单】流程节点的字段。</p>
<p>一般是<strong>客服</strong>提故障单据，所以操作角色选择【通用角色表】-&gt; 【客服】(客服角色授权详见给 <strong>角色分配权限</strong>）。</p>
<p><img alt="-w1336" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658551277354.jpg" /></p>
<p>点击【新增字段】，参照 <strong>梳理故障提报流程</strong>，新增每个环节中需要的字段。</p>
<p><img alt="-w1408" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658592435245.jpg" /></p>
<p>参照 <strong>梳理故障提报流程</strong>，完成整个故障受理流程的配置。</p>
<p><img alt="-w1397" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658592876789.jpg" /></p>
<h5 id="_10">启用流程</h5>
<p>【启用流程】，选择适合的通知策略，点击【提交】完成流程设计。</p>
<p><img alt="-w1404" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658593359980.jpg" /></p>
<h5 id="_11">流程模板实例化</h5>
<p>选择菜单【流程设计】，找到刚编辑的故障受理流程，点击【部署】，生成流程实例。</p>
<p><img alt="-w1403" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658593653122.jpg" /></p>
<h4 id="_12">在服务目录中新增"故障受理"服务，并绑定流程</h4>
<p>选择菜单【服务】，点击【新增】按钮，新增"故障受理"服务，并<strong>关联</strong>刚生成的流程实例。</p>
<p><img alt="-w1403" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658595078266.jpg" /></p>
<p>选择菜单【服务目录】，选中【根目录】，点击右侧【 <strong>⋮</strong> 】，点击【新增】，按提示新增一个名为<strong>故障受理</strong>的服务目录。</p>
<p><img alt="-w1402" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658595666163.jpg" /></p>
<p>选中刚刚创建的服务目录【故障受理】，右侧会显示【添加】按钮，点击该按钮添加<strong>故障受理</strong>服务。</p>
<p><img alt="-w1404" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658596158089.jpg" /></p>
<p>至此，流程设计和服务目录已新建好，接下来做一次故障提报演示。</p>
<h3 id="_13">一次故障提报示例</h3>
<p><img alt="-w768" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658720727110.jpg" /></p>
<h4 id="_14">客服提报故障单</h4>
<p>用<code>客服</code>账号登录 ITSM ，选择【事件管理】菜单，点击【新增事件】，选择【故障受理】服务，点击【提交】。</p>
<p><img alt="-w1332" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658597438200.jpg" /></p>
<p>在【新增事件】界面，填写<strong>本次故障提报的关键信息</strong>，包括故障标题、截图以及故障处理团队等。</p>
<p>点击【提交】，提报故障。</p>
<p><img alt="-w1331" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658604949447.jpg" /></p>
<h4 id="_15">运维跟进故障处理</h4>
<p>运维收到一封<strong>待处理</strong>的<strong>故障受理</strong>邮件。</p>
<p><img alt="-w619" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658606919760.jpg" /></p>
<p>使用<strong>运维</strong>账号登录 ITSM ，在待办列表中，找到待处理的故障单。</p>
<p><img alt="-w1499" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658608778520.jpg" /></p>
<p>点击链接，填写故障处理记录，点击【通过】，完成本环节流程。</p>
<p><img alt="-w1491" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658613447194.jpg" /></p>
<h4 id="_16">故障总结</h4>
<p>处理完故障后，运维<strong>复盘本次故障</strong>，做故障总结。</p>
<p><img alt="-w1662" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658620538481.jpg" /></p>
<h4 id="qc">QC 做故障评估</h4>
<p>QC（质量保障）人员在工作台的待办列表中，找到本次故障的单据。</p>
<p><img alt="-w1497" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658621496239.jpg" /></p>
<p>QC 依据本次故障的影响范围、原因以及处理情况，做出故障评估。</p>
<p><img alt="-w1492" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658622710282.jpg" /></p>
<p>至此，一次<strong>故障提报和处理的流程结束</strong>。</p>
<p><img alt="-w1498" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CO/assets/15658623014535.jpg" /></p><h1 id="_1">快速入门</h1>
<p>要快速的接触监控平台先通过快速入门会有一个基本的认识。</p>
<h2 id="_2">接入流程</h2>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15800415288588.jpg" /></p>
<p>基本上接入流程有如下阶段：</p>
<ol>
<li><strong><a href="prepare.md">准备工作</a></strong>：监控平台的监控目标和进程信息主要是依赖 CMDB 的配置，监控的采集链路依赖蓝鲸 Agent 的部署，监控的功能使用依赖<a href="../functions/global/permissions.md">权限的设置</a></li>
<li><strong>数据采集</strong>：监控本身就是围绕数据来工作的，数据从何而来要么通过<a href="../functions/conf/plugins.md">监控插件</a>和<a href="../functions/conf/collect-tasks.md">采集配置</a>获取，要么通过<a href="../functions/conf/custom-report.md">自定义上报</a>主动上报上来，或者直接使用<a href="../guide/bigdata_monitor.md">数据平台</a>的结果表数据</li>
<li><strong>数据检查</strong>：数据是否采集成功，最终还是以是否可以查看相关的图形数据为主。每个采集任务都有一个 <strong>检查视图</strong> 可以查看当前主机/实例采集的数据情况。当然也可以从<a href="../functions/report/dashboard.md">Dashboard</a>去检索一个任意的指标</li>
<li><strong>策略配置</strong>：采集上来的数据要么看要么告警，想要告警的指标通过策略配置进行设置。可以提前规划下告警组在告警通知的时候需要使用</li>
<li><strong>告警处理</strong>：当策略生效并且触发了告警，我们可以通过<a href="../functions/analyze/event.md">事件中心</a>进行查看，也可以通过<a href="../functions/conf/rules.md">告警通知</a>接收到相应的告警内容，对于告警事件可以快速的进行<strong>告警确认</strong>或<a href="../functions/conf/block.md">告警屏蔽</a></li>
<li><strong>其他</strong>：还有很多其他的高级功能可以使用。 <a href="../functions/conf/import-export.md">导入导出</a>，<a href="../functions/global/admin-config.md">全局配置</a></li>
</ol>
<h2 id="_3">监控的四个阶段</h2>
<p>监控平台有这么多功能，有这么多的文档，如何循序渐进的使用监控平台呢？大致可以分为四个层面： </p>
<ul>
<li>第一层：开箱即用               -- <strong>适用于初级用户</strong> </li>
<li>第二层：扩展采集和告警自动处理   -- <strong>适用于高级用户</strong> </li>
<li>第三层：策略高级控制和配置分享   -- <strong>适用于专家级用户</strong></li>
<li>第四层：平台管理和插件开发   -- <strong>适用于管理员和二次开发者</strong></li>
</ul>
<h3 id="_4">第一层： 开箱即用</h3>
<ul>
<li>主机-操作系统监控 <ul>
<li>CMDB 中纳管的机器并且安装了 Agent 的机器会默认进行采集</li>
<li>默认采集的指标 <a href="../functions/addenda/host-metrics.md">主机-操作系统-指标</a></li>
<li>默认采集的事件 <a href="../functions/addenda/host-events.md">主机-操作系统-系统事件</a></li>
<li>主机监控 主机图表查看和对比等功能 <a href="../functions/scene/host-monitor.md">主机监控</a></li>
</ul>
</li>
<li>内置的默认策略 <a href="../functions/addenda/builtin-rules.md">内置策略</a></li>
<li>主机-进程监控<ul>
<li>CMDB 配置的进程默认就会进行采集</li>
<li>默认采集的进程指标和事件 <a href="../functions/addenda/process-metrics.md">主机-进程-指标</a></li>
</ul>
</li>
<li>官方插件： 内置 20 款官方插件，可直接在采集中使用，满足常用组件的监控需求。提供动态的采集需求，自动增删采集<ul>
<li><a href="../functions/addenda/builtin-plugins.md">内置官方插件</a></li>
<li><a href="../functions/conf/collect-tasks.md">采集配置</a></li>
</ul>
</li>
<li>策略配置：可满足 IP，服务实例，集群模块的监控需求，提供 8 种检测算法。并且支持数据平台的数据监控需求<ul>
<li><a href="../functions/addenda/algorithms.md">算法说明</a></li>
<li><a href="../functions/conf/rules.md">策略配置</a></li>
<li><a href="../functions/conf/alarm-group.md">告警组</a></li>
<li><a href="../guide/bigdata_monitor.md">如何监控数据平台的数据</a></li>
</ul>
</li>
<li>监控屏蔽：提供服务实例，IP，集群模块，策略，事件的屏蔽粒度<ul>
<li><a href="../functions/conf/block.md">告警屏蔽</a></li>
</ul>
</li>
<li>仪表盘：提供不同的图表配置，支持日志数据、数据平台数据、监控采集的指标数据画图需求<ul>
<li><a href="../functions/report/dashboard.md">仪盘表</a></li>
</ul>
</li>
<li>服务拨测：提供模拟用户请求的监控需求。 <ul>
<li><a href="../functions/scene/dial.md">服务拨测</a></li>
</ul>
</li>
<li>日志采集和监控<ul>
<li>通过日志平台可以进行日志采集和字段提取</li>
<li>方便的日志检索功能</li>
<li>日志关键字告警功能和日志的指标数据监控能力</li>
<li>日志的指标数据画图能力</li>
<li><a href="../guide/log_monitor.md">如何监控日志平台的数据</a></li>
</ul>
</li>
</ul>
<h3 id="_5">第二层： 扩展采集和告警自动处理</h3>
<ul>
<li>在线制作插件：通过在线插件制作来扩充采集能力，插件制作提供了脚本，Exporter，，JMX，BK-Pull 5 种便利的插件制作类型。可以几分种实现一个好用的采集插件。并且还提供远程采集的方式来满足不方便 Agent 部署的情况。<ul>
<li><a href="../functions/conf/plugins.md">插件制作</a></li>
<li><a href="../guide/script_collect.md">如何通过脚本进行监控</a></li>
<li><a href="../guide/multi_instance_monitor.md">如何实现多实例采集</a></li>
<li><a href="../guide/component_monitor.md">如何对开源组件进行监控</a></li>
<li><a href="../guide/import_exporter.md">如何在线制作 Exporter 插件</a></li>
<li><a href="../guide/import_datadog_online.md">如何在线制作  插件</a></li>
<li><a href="../guide/plugin_jmx.md">如何在线制作 JMX 插件</a></li>
<li><a href="../guide/noagent_monitor.md">无 Agent 如何实现采集</a></li>
</ul>
</li>
<li>自定义上报： 通过自定义上报来扩充采集能力，通过 HTTP 方式上报可以满足业务灵活的业务指标数据上报的能力。 <ul>
<li><a href="../functions/conf/custom-report.md">自定义上报</a></li>
</ul>
</li>
<li>告警回调能力：通过 HTTP 的告警回调，可以进行自动触发。    <a href="../guide/http_callback.md">如何设置告警回调</a></li>
<li>故障自愈能力：通过故障自愈对接对接监控打通处理动作。</li>
</ul>
<h3 id="_6">第三层： 策略高级控制和配置分享</h3>
<ul>
<li>精细化控制：无数据告警，告警恢复，告警收敛和汇总控制<ul>
<li><a href="../functions/addenda/coverge.md">通知收敛和汇总机制</a></li>
</ul>
</li>
<li>自定义告警通知模版：通过模版满足个性化需求<ul>
<li><a href="../guide/notify_case.md">如何自定义通知模版</a></li>
<li><a href="../functions/addenda/variables.md">变量列表</a></li>
</ul>
</li>
<li>策略抑制能力：小范围优先级大于大范围</li>
<li>主机运营字段：通过主机的运营字段来控制是否要进行监控，可与发布和故障处理相关操作打通</li>
<li>忽略进程端口范围端：某些进程端口范围不是用于监控的</li>
<li>导入和导出：可以通过采集，策略，插件的批量导入导出来满足配置的快速分享</li>
</ul>
<h3 id="_7">第四层： 平台管理和插件开发</h3>
<ul>
<li>插件程序开发：当市面上没有合适的插件时，可以自己制作开发。Python 和 Golang 两种语言可以选择自己更擅长的<ul>
<li><a href="../dev/plugin_exporter_dev.md">Exporter 插件开发</a></li>
<li><a href="../dev/plugin_datadog_dev.md">插件开发</a></li>
</ul>
</li>
<li>全局管理：有很多功能控制在全局配置，如磁盘的黑名单，告警风暴的阈值，通知渠道的设置<ul>
<li><a href="../functions/global/admin-config.md">全局配置</a></li>
</ul>
</li>
<li>自监控：监控的监控，保证平台的稳定性<ul>
<li><a href="../functions/global/self-monitor.md">自监控</a></li>
</ul>
</li>
</ul><h1 id="_1">快速接入</h1>
<p>快速接入以一个简单的网站做为参考例子，演示如何实现监控的全面覆盖。借此对监控平台的使用也会有一个基本的认识。</p>
<p>大致的步骤：</p>
<ul>
<li>step 1 了解网站架构及确定监控点</li>
<li>step 2 CMDB 配置和准备工作</li>
<li>step 3 配置主机-操作系统和主机-进程监控</li>
<li>step 4 配置服务-组件监控</li>
<li>step 5 配置服务-服务模块的日志监控</li>
<li>step 6 配置应用-服务拨测监控</li>
<li>step 7 通过自定义上报补充业务监控</li>
<li>step 8 分享配置</li>
</ul>
<h2 id="step-1">step 1 了解网站架构及确定监控点</h2>
<p><img alt="快速接入案例截图" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15834003432759.jpg" /></p>
<table>
<thead>
<tr>
<th>用途</th>
<th>IP</th>
<th>进程</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>web1</td>
<td>10.0.15.239</td>
<td>nginx php-fpm</td>
<td>typecho blog 程序</td>
</tr>
<tr>
<td>web2</td>
<td>10.0.15.155</td>
<td>nginx php-fpm</td>
<td>typecho blog 程序</td>
</tr>
<tr>
<td>mysql master</td>
<td>10.0.15.96</td>
<td>mysql mysqld_safe</td>
<td>数据库主</td>
</tr>
<tr>
<td>mysql slave</td>
<td>10.0.15.138</td>
<td>mysql mysqld_safe</td>
<td>数据库从</td>
</tr>
</tbody>
</table>
<p>为了保证该 BLOG 网站的稳定性，进行一个全方位的监控至少需要满足如下的监控需求：</p>
<ol>
<li>4 台主机的操作系统数据 -- 监控主机的稳定性</li>
<li>4 台主机上的进程数据 -- 监控进程的运行数据和存活性</li>
<li>nginx，php-fpm，mysql 的组件运行数据 -- 监控组件的运行数据</li>
<li>blog 程序的日志数据  -- 采集日志定位和日志关键字告警</li>
<li>网站的拨测数据 -- 远程监控网站可用率</li>
</ol>
<blockquote>
<p>blog 程序选择了<a href="http://typecho.org/">typecho</a>这个轻量的程序做为示例。</p>
</blockquote>
<h2 id="step-2-cmdb">step 2 CMDB 配置和准备工作</h2>
<ul>
<li><a href="../../../配置平台/产品白皮书/产品功能/BusinessManagement.md">创建业务</a></li>
<li><a href="../../../配置平台/产品白皮书/产品功能/SetTemp.md">创建集群</a></li>
<li>
<p><a href="../../../配置平台/产品白皮书/产品功能/Model.md">创建模块</a></p>
<blockquote>
<p>如果进程配置在每台上面是一样的，是建议使用集群模版和服务模版的功能
如果进程配置在每台上面不一样的，建议查看 <a href="../guide/multi_instance_monitor.md">如何实现多实例监控</a></p>
</blockquote>
</li>
</ul>
<p>更多请查看 <a href="./prepare.md">准备工作</a></p>
<p>web 配置</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15809126500018.jpg" /></p>
<p>mysql 配置</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15809126100566.jpg" /></p>
<p>更多进程配置方法查看<a href="../guide/process_cases.md">进程配置种类</a></p>
<h2 id="step-3-">step 3 配置主机-操作系统和主机-进程监控</h2>
<p>当配置好了进程信息后，在“主机监控”将看到相应采集的数据。</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15809625239667.jpg" /></p>
<p>平台自带默认的策略详细查看<a href="../functions/addenda/builtin-rules.md">内置策略</a>，当内置策略不满足需求的时候可以增加监控策略。</p>
<p>配置进程端口监控：导航  →  监控配置  →  策略  →  新建</p>
<p><img alt="进程端口截图" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15833972925153.jpg" /></p>
<p>在事件中心查看告警信息：导航  →  事件中心</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15809895919471.jpg" /></p>
<p>更多请查看场景案例：</p>
<ul>
<li><a href="../functions/scene/host-monitor.md">主机监控</a></li>
<li><a href="../guide/process_monitor.md">如何对进程进行监控</a></li>
<li><a href="../guide/os_monitor.md">如何对操作系统进行监控</a></li>
</ul>
<h2 id="step-4-">step 4 配置服务-组件监控</h2>
<p>对于 MySQL、Nginx 使用监控平台官方内置的组件就可以快速的实现组件监控的需求。 更多内置组件查看“导航  →  监控配置  →  插件”</p>
<ul>
<li><a href="../functions/addenda/builtin-plugins.md">内置插件</a></li>
<li><a href="../functions/conf/plugins.md">插件管理</a></li>
</ul>
<p>使用的时候直接在“导航  →  监控配置  →  采集”中直接使用插件能力即可。按插件的配置方法进行设置。</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15809632369678.jpg" /></p>
<p>采集的数据可在“检查视图”和“仪表盘”中查看，更多的使用方法查看 <a href="../functions/conf/collect-tasks.md">采集配置</a></p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15809774652787.jpg" /></p>
<p>策略配置具体查看 <a href="../functions/conf/rules.md">策略配置</a></p>
<p>像 PHP-FPM 没有内置的官方插件可以直接使用，可以查看 <a href="../guide/component_monitor.md">如何对开源组件进行监控</a>。</p>
<h2 id="step-5-">step 5 配置服务-服务模块的日志监控</h2>
<p>采集程序的访问日志</p>
<p>日志采集： 导航  →  监控配置  →  采集  →  日志采集  →  新建</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15809715128894.jpg" /></p>
<ul>
<li>字段提取-格式化数据</li>
</ul>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15809846202210.jpg" /></p>
<p>数据检索-查看日志采集的数据，更多的使用方法查看 <a href="../functions/analyze/data-search.md">数据检索</a>。</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15809845810410.jpg" /></p>
<p>配置日志告警-日志关键字包含 login.php 每分钟超过 10 进行告警。</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15809852566515.jpg" /></p>
<p>更多日志监控配置查看 <a href="../guide/log_monitor.md">如何通过日志数据进行监控</a></p>
<h2 id="step-6-">step 6 配置应用-服务拨测监控</h2>
<p>增加远程的首页检测，通过服务拨测判断网站的稳定性。</p>
<ul>
<li>新建拨测任务</li>
</ul>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15809864515258.jpg" /></p>
<ul>
<li>查看拨测结果</li>
</ul>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15809863857690.jpg" /></p>
<p>还可以设置可用率，响应时长的监控策略，更多请查看。</p>
<ul>
<li><a href="../functions/scene/dial.md">服务拨测</a></li>
</ul>
<h2 id="step-7">step 7 通过自定义上报补充业务监控</h2>
<p>业务代码里面想直接将监控数据上报，有 SDK，命令行工具，HTTP 等方式。</p>
<p>具体查看<a href="../functions/conf/custom-report.md">自定义上报功能</a></p>
<h2 id="step-8">step 8 分享配置</h2>
<p>如果每个业务的网站架构都是差不多，每次都配置一遍 step3-step6 是不是很繁琐。 那么将他们做成一个模版直接导出和导入吧。</p>
<p>导航 →  监控配置 →  导入导出</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/quickstart/media/15809898304165.jpg" /></p>
<p>更多请查看<a href="../functions/conf/import-export.md">导入和导出功能介绍</a></p><h1 id="_1">插件制作</h1>
<p>所有的采集配置都需要先定义插件(除了内置插件，如日志)，插件包含内置插件和自定义插件， 业务私有插件和公共插件，插件的本地采集和远程采集模式，支持不同的操作系统。</p>
<h2 id="_2">前置步骤</h2>
<blockquote>
<p>注意：对于 Linux 和 Windows 都默认只支持 64 位的操作系统。如果需要支持 32 位的操作系统，需要进行订制。</p>
</blockquote>
<p>插件输出格式说明：详细查看 <a href="../../concepts/datamodule.md#Promtheus的数据结构">数据模型</a>之『监控平台支持 Promtheus 的数据结构』。</p>
<p><strong>工作原理</strong>：</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/conf/media/15767474716683.jpg" /></p>
<p><strong>术语解释</strong>：</p>
<ul>
<li><strong>采集器</strong>： Monitor Collector 监控内置的采集器，像 basereport 采集操作系统的指标， bkmonitorbeat 管理采集插件。</li>
<li><strong>采集插件</strong>： 用户自定义的采集插件，可以基于标准要求进行无限扩展。</li>
</ul>
<blockquote>
<p>两者的区别，更多请查看<a href="../../concepts/glossary.md">术语解释</a></p>
</blockquote>
<h2 id="_3">主功能一览</h2>
<ul>
<li>支持的操作系统：Linux、Windows、AIX6、AIX7</li>
<li>支持的插件类型：Exporter、DataDog、Script(Linux：Shell、Python、Perl、自定义，Windows：PowerShell、VBS、Python、自定义)、BK-Pull、JMX</li>
<li>支持的运作方式：公共插件、远程插件、官方插件</li>
<li>参数定义：命令行参数、环境变量、位置参数</li>
<li>插件导入导出</li>
<li>插件调试</li>
<li>插件定义：LOGO，描述，指标维度单位等</li>
</ul>
<h2 id="_4">功能说明</h2>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/conf/media/15754467635624.jpg" /></p>
<p>插件的制作分为几种情况：</p>
<ol>
<li>在线定义，直接在 web 界面定义，比如：<a href="../../guide/import_exporter.md">如何使用开源的 Exporter</a></li>
<li>线下定义，线下将插件包制作好，直接导入，比如：<a href="../../guide/import_datadog_offline.md">如何线下定义 DataDog 插件</a></li>
<li>采集程序本身的开发，比如：<ul>
<li><a href="../../dev/plugin_exporter_dev.md">Exporter 插件开发</a></li>
<li><a href="../../dev/plugin_datadog_dev.md">DataDog 插件开发</a></li>
</ul>
</li>
</ol>
<h3 id="_5">插件导入和导出</h3>
<p>插件导入支持单个自定义插件的导入和导出</p>
<p>认证的插件可以批量导入</p>
<blockquote>
<p><strong>注意</strong>：
1) 官方插件因为默认是公共插件，只有管理员权限的才可以导入
2) 在菜单的配置导入导出也可以导出相关联的插件</p>
</blockquote>
<h3 id="_6">在线制作插件</h3>
<p><strong>插件定义基本流程</strong>：</p>
<ul>
<li><strong>第一步： 插件定义</strong><ul>
<li>插件的基本信息：ID，别名，分类，是否为公共插件，是否支持远程</li>
<li>插件主体内容：<ul>
<li>脚本/二进制程序/配置内容</li>
<li>参数定义</li>
</ul>
</li>
<li>插件的辅助信息：描述，LOGO</li>
</ul>
</li>
</ul>
<p><img alt="定义插件" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/conf/media/15833902302710.jpg" /></p>
<blockquote>
<p>注意：公共插件只有平台权限才可以进行设置。设置完就是全平台全业务可用。</p>
</blockquote>
<ul>
<li><strong>第二步： 插件调试</strong></li>
</ul>
<p>插件调试是为了确保插件的制作返回的数据是正常的。</p>
<ul>
<li>
<p>步骤：
        * 参数填写
        * 选择调试机器
        * 调试过程
        * 设置指标和维度
        * 保存</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/conf/media/15833949594912.jpg" /></p>
</li>
</ul>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/conf/media/15833949793387.jpg" /></p>
<h4 id="_7">参数定义说明</h4>
<p>参数定义提供了三种方式：命令行参数、位置参数、环境变量。</p>
<h5 id="_8">命令行参数</h5>
<p>最常见的参数定义方式。</p>
<p>如 redis_exporter 的启动参数</p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Environment Variable Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>redis.addr</td>
<td>REDIS_ADDR</td>
<td>Address of the Redis instance, defaults to <code>redis://localhost:6379</code>.</td>
</tr>
<tr>
<td>redis.password</td>
<td>REDIS_PASSWORD</td>
<td>Password of the Redis instance, defaults to <code>""</code> (no password).</td>
</tr>
</tbody>
</table>
<p>如定义 <code>--redis.addr  redis://localhost:6379</code></p>
<p>可以这样设置：选择命令行参数</p>
<ul>
<li>参数名称： <code>--redis.addr</code></li>
<li>默认值：文本  <code>redis://localhost:6379</code></li>
<li>参数说明：Address of the Redis instance, defaults to <code>redis://localhost:6379</code></li>
</ul>
<p>更多完整的 redis_exporter 的插件制作查看 <a href="../../guide/import_exporter.md">如何使用开源的 Exporter 在线制作插件</a></p>
<h5 id="_9">位置参数</h5>
<p>在 shell 脚本里面经常使用到，如<code>$1,$2</code>这类方式。</p>
<p>比如脚本执行 <code>./script1.sh  localhost 6379</code></p>
<p>那么在脚本里面肯定有接收的位置</p>
<pre class="codehilite"><code class="language-bash">#!/bin/bash
redis-cli -h $1 -p $2</code></pre>


<p>那么就可以这样设置(以$1 为例）：选择位置参数</p>
<ul>
<li>参数名称： <code>redis地址</code>      # 参数名称在位置参数里面就是一个显示名，在插件使用的时候参数填写部分会显示这个。</li>
<li>默认值：文本  <code>localhost</code>   # 可以设置默认值，也可以不设置</li>
<li>参数说明： <code>redis地址填写，默认为localhost</code></li>
</ul>
<blockquote>
<p>注意：<code>$1 $2</code>以设置的顺序来决定。</p>
</blockquote>
<h5 id="_10">环境变量</h5>
<p>在程序里面使用的是环境变量来获取的内容。就使用环境变量参数定义。</p>
<p>比如在程序中直接获取环境变量中的变量，想让这个变量可以由插件的使用者来设置 <code>os.getenv('PYTHONPATH')</code></p>
<p>那么可以这样设置：选择环境变量</p>
<ul>
<li>参数名称：<code>PYTHONPATH</code></li>
<li>默认值：文本 <code>/usr/bin/python</code></li>
<li>参数说明：<code>Python 的路径 默认为/usr/bin/python</code></li>
</ul>
<h4 id="script">Script 插件定义</h4>
<p>Script 就是由用户自定义脚本进行 Metrics 采集。只要符合监控的标准格式就可以把数据采集上来。 支持的脚本有：</p>
<ul>
<li>
<p>Linux：Shell，Python，自定义</p>
</li>
<li>
<p>Windows：Shell，Python，VBS，PowerShell，自定义</p>
</li>
</ul>
<blockquote>
<p>INFO：自定义是直接执行，不用解释器进行执行。 如 ./script</p>
</blockquote>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/conf/media/15794940408106.jpg" /></p>
<ul>
<li><a href="../../guide/script_collect.md">如何通过脚本进行监控</a></li>
</ul>
<h4 id="exporter">Exporter 插件定义</h4>
<p>Exporter 是用于暴露第三方服务的 metrics 给 Prometheus。是 Prometheus 中重要的一个组件。</p>
<p>按监控平台插件的规范就可以将开源的 Exporter 插件变成监控平台的采集能力。</p>
<p>运行的 Exporter 是 go 的二进制程序，需要定义启动进程和占用端口。</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/conf/media/15794940142991.jpg" /></p>
<ul>
<li><a href="../../guide/import_exporter.md">如何使用开源的 Exporter 采集能力</a></li>
</ul>
<h4 id="datadog">DataDog 插件定义</h4>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/conf/media/15794940751608.jpg" /></p>
<ul>
<li><a href="../../guide/import_datadog_online.md">如何使用开源的 DataDog 采集能力</a></li>
</ul>
<h4 id="jmx">JMX 插件定义</h4>
<p>JMX 可以采集任何开启了 JMX 服务端口的 java 进程的服务状态，通过 JMX 采集 java 进程的 jvm 信息，</p>
<p>包括 gc 耗时、gc 次数、gc 吞吐、老年代使用率、新生代晋升大小、活跃线程数等信息。</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/conf/media/15794940240535.jpg" /></p>
<ul>
<li><a href="../../guide/plugin_jmx.md">如何定义一个 JMX 的插件</a></li>
</ul>
<h4 id="bk-pull">BK-Pull 插件定义</h4>
<p>BK-Pull 主要是解决那些只暴露了端口服务的数据源。通过 pull 拉取目标的数据。</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/conf/media/15794940929248.jpg" /></p>
<ul>
<li><a href="../../guide/howto_bk-pull.md">如何直接获取 Prometheus 的数据</a></li>
</ul>
<h4 id="_11">远程插件定义</h4>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/conf/media/15794941254275.jpg" /></p>
<ul>
<li><a href="../../guide/noagent_monitor.md">如何在不安装蓝鲸 Agent 情况下实现监控</a></li>
</ul>
<h4 id="_12">公共插件定义</h4>
<p>公共插件只有管理员可以设置，设置为公共插件之后监控平台的用户都可以使用该插件。</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/conf/media/15795316967969.jpg" /></p>
<blockquote>
<p>注意：一旦设为公共插件并且有采集配置之后就不能取消，除非没有一个采集依赖。</p>
</blockquote>
<h3 id="_13">线下制作插件</h3>
<p>插件完全也可以通过线下制作直接进入导入，线下插件制作主要清楚各种插件的配置内容及关系。</p>
<ul>
<li><a href="../../functions/addenda/plugins_explain.md">插件配置说明</a></li>
<li><a href="../../guide/import_datadog_offline.md">如何线下定义 DataDog 插件</a></li>
</ul>
<h3 id="_14">升级插件</h3>
<p>每次修改插件都会进行版本的记录，版本记录分为两类。如：x.y。升级插件的动作在编辑完插件完后在采集配置中会有相应的升级提醒。</p>
<blockquote>
<p>注意：x 和 y 都是各自变化，不受影响。</p>
</blockquote>
<p>大版本 x</p>
<ul>
<li>二进制/脚本修改</li>
<li>配置模板修改</li>
<li>参数修改</li>
<li>是否为远程采集</li>
</ul>
<p>小版本 y</p>
<ul>
<li>插件指标</li>
<li>插件描述</li>
<li>插件别名</li>
<li>LOGO</li>
</ul><h1 id="_1">新仪表盘</h1>
<p>新仪表盘非常的灵活，意味着也有很多实用的功能，接下来一一介绍这些功能。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909151125720.jpg" /></p>
<h3 id="_2">新建视图和分组</h3>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909151841007.jpg" /></p>
<ol>
<li>新建视图，可以先选数据也可以先选图</li>
<li>如果想实现分组，使用 Convert to row 就可以实现类似的分组功能</li>
</ol>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909152553607.jpg" /></p>
<h3 id="_3">视图种类</h3>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909152982065.jpg" /></p>
<h3 id="query">Query 数据面板说明</h3>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909154784863.jpg" /></p>
<ul>
<li>监控对象：数据的分类，当找不到你的数据时可能是监控对象选错了</li>
<li>指标选择：选择正确的指标</li>
<li>汇聚方法：当一个汇聚周期内有多个数据点时，这个时候要注意选择汇聚方法。当采集的数据是 1 分钟，汇聚周期也是 1 分钟时，并且数据点也只有一个，那么汇聚方法不论是 SUM MAX MIN 其实都是一样的</li>
<li>维度：类似 Group by </li>
<li>条件：类似 Where 用于过滤数据</li>
<li>目标选择：是快捷的 IP/实例选择方法</li>
<li>功能：里面包含 排序(top bottom)，还有时间偏移用于时间对比数据</li>
<li>别名：一般默认的示例名称都很长，那么就可以好好利用别名功能让图表更好看</li>
</ul>
<h3 id="_4">别名功能</h3>
<p>别名语法：以<code>$</code>开头，<code>$表头_字段名</code></p>
<p>比如：指标 id. 表头为<code>metric</code> ， 字段名为<code>id</code> . 所以整个变量为： <code>$metric_id</code> 如果是要显示指标名就是. <code>$metric_name</code></p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909158599688.jpg" /></p>
<p>比如：维度名 . 表头为<code>tag</code>，字段名为<code>device_name</code>，所以整个变量为：<code>$tag_device_name</code> 。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909159867716.jpg" /></p>
<h3 id="top-bottom">TOP 或 Bottom 功能</h3>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909161037141.jpg" /></p>
<p>使用功能里面有 TOP 和 Bottom 设置一个 limit 的数字就可以实现 TOP 的数据查询。</p>
<h3 id="_5">时间对比</h3>
<p>与过去某天数据对比，就可以使用时间偏移功能。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909162545529.jpg" /></p>
<p>时间格式：</p>
<table>
<thead>
<tr>
<th>key</th>
<th>shorthand</th>
</tr>
</thead>
<tbody>
<tr>
<td>years</td>
<td>y</td>
</tr>
<tr>
<td>quarters</td>
<td>Q</td>
</tr>
<tr>
<td>months</td>
<td>M</td>
</tr>
<tr>
<td>weeks</td>
<td>w</td>
</tr>
<tr>
<td>days</td>
<td>d</td>
</tr>
<tr>
<td>hours</td>
<td>h</td>
</tr>
<tr>
<td>minutes</td>
<td>m</td>
</tr>
<tr>
<td>seconds</td>
<td>s</td>
</tr>
</tbody>
</table>
<p>如：<code>1d 1day 1days</code></p>
<h3 id="_6">变量功能</h3>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909166728713.jpg" /></p>
<p>在仪表盘的设置里面有一个变量功能，设置了变量再配合查询的条件就可以实例变量的联动效果。接下来配置一个集群模块对应的主机查询为例。</p>
<h4 id="_7">配置集群和模块的联动变量</h4>
<p>先配置集群<code>cluster</code>。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909167828079.jpg" /></p>
<p>再配置模块<code>module</code>，模块里面的查询条件以集群 ID 做为条件。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909168115182.jpg" /></p>
<h4 id="_8">配置主机</h4>
<p>设置变量<code>host</code>。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909169050479.jpg" /></p>
<p>可以开启多主机选择和 all 条件 </p>
<p>就可以看到如下的效果。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909169503835.jpg" /></p>
<h4 id="_9">配置查询条件关联</h4>
<p>在条件里面使用 host 变量，就可以达到联动查询的效果</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909170041853.jpg" /></p>
<h3 id="_10">数据下钻</h3>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909170724714.jpg" /></p>
<p>如该图配置了数据下钻，点击了该 IP 通过“主机详情”就可以跳转到主机监控对应的页面。</p>
<p>配置方法：在视图配置里面，使用<code>Add link</code>功能，在 URL 里面使用相关变量</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/functions/report/media/15909171979647.jpg" /></p><h1 id="_1">日志关键字监控</h1>
<p>日志关键字监控指的是通过日志的里面关键字匹配出来的数量进行告警判断是否有问题，是一种比较常见的监控需求。在监控平台有两种日志关键字配置方法。 </p>
<h2 id="_2">前置步骤</h2>
<p>先了解两种日志关键字的工作原理：</p>
<h3 id="_3">第一种：基于日志平台数据的日志关键字</h3>
<p>日志平台的数据不敢是自采集的，第三方 ES 的还是数据平台的最终都是存储在 ES 的存储里面。所以这类数据的日志关键字都是基于 ES 查询语法日志关键。</p>
<ul>
<li>
<p><strong>优点</strong>：日志集中存储，当接到日志关键字告警后可以直接在日志平台进行查询和定位</p>
</li>
<li>
<p><strong>缺点</strong>：如果日志量很大将占用大量的带宽和存储资源。另外就是查询方法是依据分词原理。像 I/O 默认会拆分 I 和 O 来进行匹配</p>
</li>
</ul>
<p>具体配置方法： <a href="log_monitor.md">如何监控日志平台的数据</a></p>
<h3 id="agent">第二种：在 Agent 端进行日志匹配生成事件</h3>
<p>在日志所在的服务器进行日志关键字的匹配，将周期内的统计值和样本数据进行上报。再通过告警策略生成告警事件达到告警的目的。</p>
<ul>
<li><strong>优点</strong>：在日志量很大，存储资源不够的情况下也可以满足日志关键字的需求。匹配方法为正则方式更容易配置和理解。满足及时告警需求不受日志传输的延迟影响</li>
<li><strong>缺点</strong>：只有一条最新的采样数据，如果需要更多信息需要通过其他方式去查看</li>
</ul>
<p>接下来就主要介绍第二种日志关键字事件的配置方法</p>
<h2 id="_4">依赖</h2>
<p>确保采集进程已经启动</p>
<ul>
<li>
<p>Linux</p>
<p><code>bash
ps -ef | grep bkmonitorbeat</code></p>
</li>
<li>
<p>Windows</p>
<p><code>bat
tasklist | findstr bkmonitorbeat</code></p>
</li>
<li>
<p>如果没有，则需要通过<strong>节点管理</strong>应用安装，并托管启动。并且确保是最新的版本。</p>
</li>
</ul>
<h2 id="_5">第一步：配置采集</h2>
<p>导航：监控配置  →  采集  →  新建  →  采集方式(Log)</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/guide/media/15909118691554.jpg" /></p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/guide/media/15909118752709.jpg" /></p>
<h3 id="_6">日志路径</h3>
<p>填写轮转的日志绝对路径就可以。如：</p>
<pre class="codehilite"><code class="language-bash">/var/log/nginx/nginx.log </code></pre>


<pre class="codehilite"><code class="language-bash">/var/log/xxxx/error.%Y%m%d.log</code></pre>


<h3 id="_7">维度提取</h3>
<p>关键字不单可以匹配正则还可以从行日志中提取出维度信息，来细化关键字的内容，可以使用正则提取，例如：</p>
<pre class="codehilite"><code class="language-bash">    # 假如我的日志文本是这样的
    &quot;2020-05-22 11:13:16 ERROR    28276   access.data             processor.py[172] strategy(503),item(504) query records error, System Request 'metadata_v3' error&quot;

    # 那么可以填如下正则，匹配上ERROR的同时，将我的代码模块、文件名信息提取出来
    &quot;ERROR[ 0-9]+(?P&lt;module&gt;[a-z\.]+) +(?P&lt;filename&gt;[^\[]+).*&quot;</code></pre>


<h3 id="_8">关键字正则规则</h3>
<p>正则使用的是 Golang 的正则语法，如果是有复杂的需求建议先进行调试得到正确的正则表达式， <a href="https://www.debuggex.com/">在线正则调试地址</a>。</p>
<p>正则参考语法样例：</p>
<pre class="codehilite"><code class="language-bash">([^\s]*)              # 匹配 $http_host
(\d+\.\d+\.\d+\.\d+)  # 匹配 $server_addr,$remote_addr
(\&quot;\d+\.\d+\.\d+\.\d+\,\s\d+\.\d+\.\d+\.\d+\&quot;|\&quot;\d+\.\d+\.\d+\.\d+\&quot;) #匹配 &quot;$http_x_forwarded_for&quot;
(\[[^\[\]]+\])     #匹配[$time_local]
(\&quot;(?:[^&quot;]|\&quot;)+|-\&quot;)  # 匹配&quot;$request&quot;,&quot;$http_referer&quot;，&quot;$http_user_agent&quot;
(\d{3})               # 匹配$status
(\d+|-)               # 匹配$body_bytes_sent
(\d*\.\d*|\-)         # 匹配$request_time,$upstream_response_time'
^                     # 匹配每行数据的开头
$                     # 匹配每行数据的结局</code></pre>


<h2 id="_9">第二步：检查数据</h2>
<p>通过采集下一步选择监控目标后，当前匹配的日志关键字后在“检查视图将看到相关的数据”。</p>
<p>检测视图查看采集数据（配置完后，需要等待 2 分钟左右）。</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/guide/media/15909127206617.jpg" /></p>
<h2 id="_10">第三步：配置告警策略</h2>
<p>导航：监控配置  →  策略 →  新建  →  添加日志关键字</p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/guide/media/15909129966137.jpg" /></p>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/监控平台/产品白皮书/guide/media/15909131308756.jpg" /></p>
<p>PS：当没有发现你的采集项时，注意下是不是监控对象选择错误了。</p>
<h2 id="_11">使用建议</h2>
<ul>
<li>单行日志大小：单行太长，会导致正则匹配性能较差，建议 &lt; 1k 字节</li>
<li>日志每秒产生速率：建议 &lt; 5w 每秒</li>
<li>日志文件大小速率：建议 &lt; 50M 每秒</li>
<li>正则数量限制：即页面配置的规则数：建议 &lt; (50M / 实际产生大小速率)每秒<ul>
<li>假如当前机器所有需要监听的日志文件，日志产生速率为 1M/s。则建议规则数 &lt; 50 个</li>
<li>假如当前机器所有需要监听的日志文件，日志产生速率为 2M/s。则建议规则数 &lt; 25 个</li>
</ul>
</li>
<li>正则表达式，尽可能的精确，减少".*"这种用法，提高效率。</li>
</ul>
<p>超过上面限制，会导致处理不过来，队列积压。 每个周期上报的统计数值会不准确。</p><h1 id="_1">设计理念</h1>
<blockquote>
<p>以产品设计理念剖析企业建设故障自动化处理方案的思路。</p>
</blockquote>
<p>人工处理告警，一直是运维心中的痛。大年初一拜年、结婚、和老婆孩子外出过周末等美好时光，作为运维的你，好像一直心系 IT 系统，保持与笔记本的安全距离。</p>
<p>为什么这么多年过去了，还是这么苦逼，不是说运维行业转 AIOps 了，我竟然还在手工处理告警，我该怎么办？</p>
<p>本文介绍故障自愈攻克的 3 个技术点，以及 <strong>献上开箱即用的方案</strong>。</p>
<h2 id="_2">基本流程</h2>
<p>自动化的要点是什么？<strong>把人的经验抽象、固化为程序处理</strong>，工业(第 3 次工业革命)或互联网都是如此。</p>
<p>举个例子，磁盘出现告警，运维首先想到的是登陆服务器清理磁盘。</p>
<p><img alt="-w486" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/人工处理故障.jpg" /></p>
<p>接下来，我们拆解背后的逻辑。</p>
<h3 id="_3">抽象告警处理流程</h3>
<ul>
<li>拉取磁盘告警</li>
<li>编写磁盘清理的脚本或作业任务</li>
<li>设计关联模块：<strong>把拉取到的磁盘告警，与调用脚本的模块串起来</strong></li>
</ul>
<p>流程图如下：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/15258541375579.jpg" /></p>
<h3 id="cmdb">通过 CMDB 做资源清洗</h3>
<p>不同模块的磁盘清理方案不一样，如何解决呢？</p>
<p>这时需要 <strong>引入 CMDB(设备、人、业务的映射关系)</strong>，通过 CMDB 把 <code>IP</code> 清洗为 <code>模块</code>，这样就解决了接入层 和 逻辑层、存储层的 <strong>告警使用对应的磁盘清理方案</strong>。</p>
<p>流程图如下：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/15258758921030.jpg" /></p>
<h3 id="_4">对接企业内部网关</h3>
<p>故障自愈可能会处理失败，这时需要通知用户。故障自愈的处理方式除了调用作业外，还可能需要<strong>调用企业内部的网关</strong>，比如服务器重启、申请服务器等。</p>
<p>使用 PaaS 层的 ESB 是一种解决思路，通过 ESB 封装企业内部网关，解决权限校验、频率控制、访问统计、路由分发以及自助接入等功能，不要直接调用裸接口了。</p>
<p>下图为故障自愈调用邮件和微信通知网关：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/15259298974386.jpg" /></p>
<p>经过这一轮的探索，故障自动处理的流程如下：</p>
<p><img alt="-w841" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/15681876961325.jpg" /></p>
<h3 id="_5">对接企业内部监控产品</h3>
<p>以 Zabbix、Open-Falcon 为例，介绍如何对接企业内部的监控产品。</p>
<p><img alt="-w501" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/15259239221282.jpg" /></p>
<h4 id="zabbix">对接 Zabbix</h4>
<p><a href="https://mp.weixin.qq.com/s/kZzLv2QOQvtX7Bim5n-NJQ">《当 Zabbix 遇见故障自愈》</a> 介绍了拉取 Zabbix 告警的方案，<strong>通过 ActionScript 调用脚本，把 Zabbix 告警推送至自愈的告警拉取模块</strong>。</p>
<p>推送(或叫回调)可以保证告警拉取的实时性。</p>
<p>下图为 Zabbix 推送告警示例：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/15259220015727.jpg" /></p>
<p>实际上是 Zabbix 调用推送告警的脚本：</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/15259220758436.jpg" /></p>
<p>对接 Zabbix 的落地案例可以参考陈亮撰写的 <a href="https://mp.weixin.qq.com/s/MX74-vDEOkFA0Om6WDrwYQ">那些年我们想做的无人值守</a>。</p>
<p>除 Zabbix 外，Open-Falcon 在国内的社区热度也不错，所以也介绍拉取其告警的方案。</p>
<h4 id="open-falcon">对接 Open-falcon</h4>
<p>方案类似 Zabbix，不过 Open-falcon 直接提供了 callback 功能，简化了流程。</p>
<p>下图为在 Open-Falcon 告警模板中，将故障自愈接收告警的地址，<strong>录入至 Callback 地址</strong>中。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/15259229587200.jpg" /></p>
<p>收到了 Open-Falcon 推送的告警后，解析对应的字段即可。</p>
<p>如果企业内部的 CMDB 以 IP 来标识主机，需要再做一层转换，因为 Open-Falcon 的资源标识 <code>endpoint</code> 默认是主机名，那么就需要使用 CMDB 的自动发现功能自动上报主机名，同时提供把主机名清洗为 IP 的功能。</p>
<p>下面是 Nginx 模块磁盘告警的自愈示例，匹配 Nginx 模块的磁盘清理套餐，清理 Nginx 模块的日志文件，整个过程不到 30 秒。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/15259231536432.jpg" /></p>
<p>告警自动处理看似如此简单，然而并非如此。</p>
<h2 id="_6">两面性</h2>
<p><strong>故障自动处理就像一把刀，有其两面性</strong>。</p>
<p>因为要确保告警的真实性，一旦把假告警也自动处理了，就很悲催了。</p>
<p>举个例子。网络波动，批量出现 PING 告警。实际上服务器运行正常，这时你把服务器都重启了，那就 GG 了。</p>
<p>如何解决呢？分析事物的规律。</p>
<p>批量出现告警，那可以在告警拉取模块后面，<strong>增加一个收敛模块</strong>：</p>
<ul>
<li>
<p>比如，在 X 时间内出现 Y 个告警，打电话给运维审批。</p>
</li>
<li>
<p>X 时间内同一主机出现使用相同套餐的告警，则收敛时间窗口中后面的告警则跳过，比如同时收到进程告警 和  端口告警，就不用拉 2 次进程了。</p>
</li>
</ul>
<p>还有就是，原有监控系统没有收敛能力，那么可以借用这个功能来做告警汇总，因为收敛逻辑一样，只是收敛的处理方式有差异。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/15259261288161.jpg" /></p>
<p>解决了安全和基本的告警自动处理诉求后，你可能还想处理复杂的故障处理场景。</p>
<h2 id="-">复杂告警的处理方案 - 组合套餐</h2>
<p>举个例子，A 模块是重要模块，出现 PING 不可达告警，首先要校验 A 模块是否真的故障，如果真的故障，接下来是从资源池中获取备机 ...  故障替换等等，期间每个环节都有可能出错，那就要考虑异常分支的场景。</p>
<p><strong>树结构</strong>可以解决该问题，<strong>二叉树</strong>足以满足大部分场景(成功、失败两种分支)。</p>
<p><img alt="故障自愈_二叉树" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/%E6%95%85%E9%9A%9C%E8%87%AA%E6%84%88_%E4%BA%8C%E5%8F%89%E6%A0%91.png" /></p>
<p>上面这张图，是一个自愈处理方案，可以称之为组合套餐。</p>
<p>这里同时引入了原子的概念，通过组装原子来满足各种需求场景， 和<code>资源编排</code>说的是同一个理儿。</p>
<p>注：如果你想使用三叉树，其实可以把组合套餐也作为一个原子套餐(节点)。</p>
<h2 id="_7">技术架构</h2>
<p>经过前面对 <strong>故障自愈的处理流程</strong>、<strong>故障自愈的两面性</strong>、<strong>复杂的故障处理方案</strong> 的层层梳理，我们有了一张故障自愈的技术架构图。</p>
<p><img alt="-w2020" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/15258544840664.jpg" /></p>
<p>故障自愈的告警拉取模块，周期性或通过 <strong>回调</strong> 方式从各大监控系统中获取告警，通过调用蓝鲸 CMDB 的 API <strong>解析</strong> 告警所属的业务、模块，查询该业务、模块在故障自愈配置的处理动作，经过 <strong>告警收敛</strong> 模块的过滤以确认没有大批量相同属性(如同业务、机房等)，最后执行对应的 <strong>处理动作</strong>，告警恢复，业务恢复正常。</p>
<p>相信这次以经行业验证的故障自愈做技术剖析，能对大家建设企业内部的故障自动处理方案提供参考思路。</p><h1 id="_1">组合套餐在故障替换场景中的应用</h1>
<h2 id="_2">情景</h2>
<p>场景：A 模块是重要模块，出现 Ping 不可达告警，首先要校验 A 模块是否真的故障，如果真的故障，接下来是从资源池中获取备机 ... 故障替换等等，期间每个环节都有可能出错，那就要考虑异常分支的场景。</p>
<h2 id="_3">前提条件</h2>
<ul>
<li>
<p>需要先配置企业微信，注册链接：<a href="https://work.weixin.qq.com/">企业微信首页</a> ，注意：开启微信端口 80443</p>
</li>
<li>
<p>蓝鲸故障自愈 APP 已经正常运行 创建故障自愈 APP 请参照 <a href="../guide/WeChat_approval_access_process.md">微信审批接入流程</a>。</p>
</li>
</ul>
<h2 id="_4">准备好组合套餐中每个原子(节点)的套餐</h2>
<h3 id="ping">配置 Ping 检测的原子套餐</h3>
<p>在作业平台写个简单的 Ping 检测脚本，再去故障自愈中配置 Ping 检测的自愈套餐。</p>
<p><img alt="Alt text" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/20190115071752.png" /></p>
<p><img alt="Alt text" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/20190115070423.png" /></p>
<h3 id="_5">通知和获取备机</h3>
<p>Ping 检测没有异常，则发送正常通知。如 Ping 检测异常，则使用获取备机套餐，自动获取备机，前提是空闲机池中有空闲机。</p>
<ul>
<li>配置 Ping 检测正常通知</li>
</ul>
<p><img alt="Alt text" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/20190109203901.png" /></p>
<ul>
<li>配置自动获取备机套餐</li>
</ul>
<p><img alt="Alt text" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/20190115143958.png" /></p>
<h3 id="_6">拷贝故障机属性到备机</h3>
<p>成功获取备机后，拷贝故障机属性到备机，后续处理对象故障机与备机互换，然后初始化业务，启动进程通知故障替换成功，以上步骤失败都加一个失败通知</p>
<ul>
<li>『快捷』CC 拷贝故障机属性到备机、『快捷』后续处理对象故障机与备机互换，都是快捷套餐，只要选择就好，这里就不展开了。后面初始化业务请根据企业的初始化流程来配置初始化套餐，启动进程也是一样，因为这里只是模拟所以仅用通知代替。</li>
</ul>
<h2 id="_7">配置组合套餐，并接入故障自愈</h2>
<p>接入故障自愈这里选择 REST 默认分类是为了方便触发告警，实际应用选择 Ping 不可达告警类型。
<img alt="Alt text" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/20190115150414.png" /></p>
<p><img alt="Alt text" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/20190115150843.png" /></p>
<h2 id="_8">触发告警，完成自愈</h2>
<ul>
<li>
<p>触发告警，由于这里是做测试，就不拿生产环境了，用 REST API 可以更方便的产生告警，完整流程请参照<a href="../functions/REST_API_PUSH_Alarm_processing_automation.md">REST API 推送</a>。</p>
</li>
<li>
<p>回到故障自愈中，查看自愈详情，也可以点击状态，查看执行详情</p>
</li>
</ul>
<p><img alt="Alt text" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/20190115152554.png" /></p>
<p><img alt="Alt text" src="F:\v_awjliu\BKDocs\ZH/6.0/故障自愈/产品白皮书/assets/20190115153047.png" /></p><h1 id="nginx">快速构建 Nginx 集群</h1>
<h2 id="_1">情景</h2>
<p>传统的 Nginx 集群要先部署多个 Nginx 节点，然后通过 <code>upstream</code> 统一一个入口提供给用户访问。</p>
<p>该过程操作繁琐，接下来看 BCS（容器管理平台） 如何通过 <strong>容器调度 (以 K8S 编排为例，BCS 同时还支持 Mesos)</strong> 快速构建 Nginx 集群。</p>
<h2 id="_2">前提条件</h2>
<ul>
<li><a href="https://kubernetes.io/zh/docs/concepts/">K8S 基本概念</a>，包含  <a href="https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/">Deployment</a>、<a href="https://kubernetes.io/docs/concepts/services-networking/service/">Services</a>。</li>
<li><a href="../../../部署指南/产品白皮书/增强包安装/部署安装/BCS-V2.md">完成 BCS 部署</a></li>
<li>准备 2 台云主机：4 核 8 G，不低于 CentOS 7，K8s Master 和 Node 各 1 台</li>
<li>完成上述 2 台云主机的 Agent 安装 ，并分配至 CMDB 业务下</li>
</ul>
<h2 id="_3">操作步骤</h2>
<ul>
<li>新建集群</li>
<li>BCS 快速构建 Nginx 集群</li>
</ul>
<h3 id="_4">新建集群</h3>
<h4 id="_5">启用容器服务</h4>
<p>在 BCS 首页，点击<code>新建项目</code>，如<code>欢乐游戏(demo)</code>。</p>
<p><img alt="-w1378" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15648362836651.jpg" /></p>
<p>然后选择容器编排类型为 <code>Kubernetes</code> ，关联前提条件中提到的 CMDB 业务，点击<code>启用容器服务</code>。</p>
<p><img alt="-w1304" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15648364147641.jpg" /></p>
<h4 id="_6">新建集群</h4>
<p><code>启用容器服务</code>后，进入容器服务欢迎页，点击<code>创建容器集群</code>。</p>
<p><img alt="-w1361" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15648365448905.jpg" /></p>
<p>按提示填写集群的基本信息。</p>
<p><img alt="-w1368" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15648366557109.jpg" /></p>
<blockquote>
<p>容器服务的集群划分和 <a href="../CMDB/CMDB_management_hosts.md">传统单体应用在 CMDB 中的集群划分</a> 很类似，可以按照<code>地域（如华北区）</code>或者<code>完全独立的应用集合（微信区）</code>来划分。</p>
</blockquote>
<p>选择 1 台云主机作为 Master。</p>
<p><img alt="-w1368" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15648366389029.jpg" /></p>
<p>点击<code>确定</code>后，集群开始初始化。</p>
<p><img alt="-w1368" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15648367382011.jpg" /></p>
<p>点击<code>节点管理</code></p>
<p><img alt="-w1363" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15648839802641.jpg" /></p>
<p>点击<code>添加节点</code>，按提示节点添加。</p>
<p><img alt="-w1368" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15648840282881.jpg" /></p>
<p>至此，新建集群完毕。可以看到集群的基础信息。</p>
<p><img alt="-w1487" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15648861584543.jpg" /></p>
<p>另外，在集群的设置(<strong>⋮</strong>)下拉菜单中，可以看到集群主要性能指标。</p>
<p><img alt="-w1488" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15648861821783.jpg" /></p>
<h3 id="bcs-nginx">BCS 快速构建 Nginx 集群</h3>
<h4 id="_7">新建命名空间</h4>
<p>新建命名空间<code>dev</code></p>
<p><img alt="-w1462" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652519427953.jpg" /></p>
<h4 id="_8">新建模板集</h4>
<p>模板集，可以类比为 K8S 中 <strong><a href="https://helm.sh/">Helm</a></strong> 的<code>Charts</code>，在 K8S 编排中，是 K8S 对象的集合：<code>Deployment（无状态）</code>、<code>StatefulSet（有状态）</code>、<code>DaemonSet（守护进程集）</code>、<code>Job（定时任务）</code>、<code>Configmap（配置项）</code>、<code>Secret（保密字典）</code>，具体参见 <a href="../../../容器管理平台/产品白皮书/Function/templatesets.md">模板集使用介绍</a> 。</p>
<p>打开菜单 <code>[模板集]</code>，新建模板集 <code>web-nginx</code>。</p>
<p><img alt="-w1466" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652520004880.jpg" /></p>
<p>按提示，填写<code>Deployment</code></p>
<p><img alt="-w1465" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652532175601.jpg" /></p>
<p><img alt="-w1462" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652535815272.jpg" /></p>
<p>填写<code>Service</code></p>
<p><img alt="-w1458" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652542476126.jpg" /></p>
<h4 id="_9">实例化</h4>
<p><img alt="-w1470" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652543011285.jpg" /></p>
<p><img alt="-w1466" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652545088426.jpg" /></p>
<h4 id="_10">检查部署效果</h4>
<p>在菜单 <code>网络</code> -&gt; <code>Services</code> 中，找到刚实例化的 Service <code>web-nginx</code></p>
<p><img alt="-w1465" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652551496895.jpg" /></p>
<p>在菜单 <code>[应用]</code> -&gt; <code>[Deployment]</code> 中可以找到 <code>web-nginx</code></p>
<p><img alt="-w1464" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652552229901.jpg" /></p>
<p>以及其运行指标</p>
<p><img alt="-w1463" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652552369974.jpg" /></p>
<p>通过访问 <code>Node+NodePort</code>，可以查看刚刚部署 Nginx 集群的版本号。</p>
<pre class="codehilite"><code class="language-bash">[root@ip-10-0-5-94-n-bcs-k8s-40015 ~]# curl 10.0.5.94:30008 -I
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Thu, 08 Aug 2019 09:11:42 GMT</code></pre>


<p>通过访问 <code>Service IP + Port</code> ，也可以查看刚部署 Nginx 的版本号。</p>
<pre class="codehilite"><code class="language-bash">[root@ip-10-0-5-94-n-bcs-k8s-40015 ~]# curl 10.254.11.4:8088 -I
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Thu, 08 Aug 2019 09:12:33 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 11 Jul 2017 13:29:18 GMT
Connection: keep-alive
ETag: &quot;5964d2ae-264&quot;
Accept-Ranges: bytes</code></pre><h1 id="_1">应用的滚动升级</h1>
<h2 id="_2">情景</h2>
<p>传统的应用更新方式是停服更新，用户在更新期间 <strong>无法使用服务</strong> 。</p>
<p>接下来，将以 Nginx 从 <code>1.12.2</code> 升级 <code>1.17.0</code> 为例，看 BCS 中的 <strong>滚动更新能力</strong> 是如何实现 <strong>不停机更新</strong> ，<strong>用户无感知</strong>。</p>
<h2 id="_3">前提条件</h2>
<ul>
<li><a href="https://kubernetes.io/zh/docs/concepts/">K8S 基本概念</a>，包含 <a href="https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/">Deployment</a>、<a href="https://kubernetes.io/docs/concepts/services-networking/service/">Services</a>。</li>
<li><a href="../../../部署指南/产品白皮书/增强包安装/部署安装/BCS-V2.md">完成 BCS 部署</a></li>
</ul>
<h2 id="_4">操作步骤</h2>
<ul>
<li>滚动更新逻辑介绍</li>
<li>BCS 滚动更新操作指引</li>
</ul>
<h3 id="_5">滚动更新逻辑介绍</h3>
<p>滚动更新的逻辑如下图，创建一个新版本的实例（ POD），销毁一个旧版本实例（POD），如此滚动，直至线上都是新版本，旧版本已全部销毁。</p>
<p>滚动更新对用户无感知。</p>
<p><img alt="-w1549" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652581859764.jpg" /></p>
<h3 id="bcs">BCS 滚动更新操作指引</h3>
<h4 id="nginx1170">推送 Nginx:1.17.0 至镜像仓库</h4>
<p>参照 <a href="../../../容器管理平台/产品白皮书/Function/image_repo.md">Harbor 仓库使用指南</a>，将镜像 Nginx:1.17.0 推送至 BCS 公共镜像仓库。</p>
<h4 id="_6">注册镜像仓库账号</h4>
<p>在 <a href="../../../部署指南/产品白皮书/增强包安装/部署安装/BCS-V2.md">部署 BCS</a> 的中控机上获取镜像仓库的访问地址。</p>
<pre class="codehilite"><code class="language-bash"># source /data/install/utils.fc &amp;&amp; echo ${HARBOR_SERVER_FQDN}:${HARBOR_SERVER_HTTPS_PORT}
hub-d.o.******.com:443</code></pre>


<p>登录仓库地址，注册镜像仓库账号。</p>
<p><img alt="-w1051" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652566855628.jpg" /></p>
<p>注册完，登录后可以访问公共仓库。</p>
<p><img alt="-w1478" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652567813655.jpg" /></p>
<h4 id="nginx1170_1">推送 Nginx:1.17.0 至镜像仓库</h4>
<p>使用 <code>docker pull</code> 从 <code>hub.docker.com</code> 拉取镜像 <code>nginx:1.17.0</code>。</p>
<pre class="codehilite"><code class="language-bash"># docker pull nginx:1.17.0
1.17.0: Pulling from library/nginx
fc7181108d40: Pull complete
c4277fc40ec2: Pull complete
780053e98559: Pull complete
Digest: sha256:bdbf36b7f1f77ffe7bd2a32e59235dff6ecf131e3b6b5b96061c652f30685f3a
Status: Downloaded newer image for nginx:1.17.0</code></pre>


<p>规范镜像 <code>tag</code> 为仓库要求的格式。</p>
<pre class="codehilite"><code class="language-bash"># docker tag nginx:1.17.0 hub-d.******.com/public/nginx:1.17.0

# docker images
REPOSITORY                                                                TAG                  IMAGE ID            CREATED             SIZE
nginx                                                                     1.17.0               719cd2e3ed04        8 weeks ago         109MB
hub-d.******.com/public/nginx                                           1.17.0               719cd2e3ed04        8 weeks ago         109MB</code></pre>


<p>推动镜像至 BCS 镜像仓库。</p>
<pre class="codehilite"><code class="language-bash"># docker push hub-d.******.com/public/nginx:1.17.0
The push refers to repository [hub-d.******.com/public/nginx]
d7acf794921f: Pushed
d9569ca04881: Pushed
cf5b3c6798f7: Pushed
1.17.0: digest: sha256:079aa93463d2566b7a81cbdf856afc6d4d2a6f9100ca3bcbecf24ade92c9a7fe size: 948</code></pre>


<p>在镜像仓库中，可以找到刚推送的 <code>Nginx:1.17.0</code> 镜像。</p>
<p><img alt="-w1465" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652572564612.jpg" /></p>
<p>在 BCS 的<code>[仓库菜单]</code>中也可以找到。</p>
<p><img alt="-w1462" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652575817580.jpg" /></p>
<h4 id="nginx-1122-1170">滚动升级 Nginx ：从 1.12.2 到 1.17.0</h4>
<p>确认当前版本号为<code>nginx/1.12.2</code></p>
<pre class="codehilite"><code class="language-bash">[root@ip-10-0-5-94-n-bcs-k8s-40015 ~]# curl 10.0.5.94:30008 -I
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Thu, 08 Aug 2019 09:11:42 GMT</code></pre>


<p>在【模板集】的【Deployment】页面中，修改【镜像及版本】，将版本从 <code>1.12.2</code> 修改为在推送 Nginx:1.17.0 至镜像仓库中上传的 Nginx 新镜像 <code>1.17.0</code>。</p>
<p><img alt="-w1633" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652627456802.jpg" /></p>
<p>点击【更多设置】，了解默认滚动升级的更新策略。</p>
<p><img alt="-w1269" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15659379375124.jpg" /></p>
<blockquote>
<ul>
<li><code>maxUnavailable</code> : 滚动升级期间，考虑应用容量，不可用 Pod 的数量上限</li>
<li><code>maxSurge</code> : 滚动升级期间，考虑集群资源，超出期望 Pod 的数量上限</li>
<li><code>minReadySeconds</code> : 滚动升级期间，考虑可用性，探测 Pod 正常后转为可用的时间</li>
</ul>
</blockquote>
<p>修改完镜像的版本后，接下来【保存】模板集，填写【新版本】的版本号。</p>
<p><img alt="-w1633" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652627905254.jpg" /></p>
<p>接着，开始滚动升级。点击菜单【应用】 -&gt; 【Deployment】，找到<code>web-nginx</code>应用，点击【滚动升级】。</p>
<p><img alt="-w1637" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652616938580.jpg" /></p>
<p>可以看到，差异点是<code>images</code>从<code>nginx:1.12.2</code>调整为<code>nginx:1.17.0</code></p>
<p><img alt="-w1637" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652628433125.jpg" /></p>
<p>点击【确定】滚动升级后，正在更新。</p>
<p><img alt="-w1636" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652628788988.jpg" /></p>
<p>通过 右下角的 【Web console】 可以通过命令行的方式获取实例(POD)的基础信息。</p>
<p><img alt="-w1636" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15652622109567.jpg" /></p>
<p>以下是更新前后的对比</p>
<pre class="codehilite"><code class="language-bash">root:~$ kubectl get pods -n dev -o wideNAME                         READY   STATUS    RESTARTS   AGE    IP            NODE                           NOMINATED NODE
web-nginx-678bb9c4fb-m8cf4   1/1     Running   0          134m   172.32.1.18   ip-10-0-5-94-n-bcs-k8s-40015   &lt;none&gt;
web-nginx-678bb9c4fb-nxwf4   1/1     Running   0          134m   172.32.1.17   ip-10-0-5-94-n-bcs-k8s-40015   &lt;none&gt;

root:~$ kubectl get pods -n dev -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP            NODE                           NOMINATED NODE
web-nginx-f95ffc78d-cxhrq   1/1     Running   0          21s   172.32.1.20   ip-10-0-5-94-n-bcs-k8s-40015   &lt;none&gt;
web-nginx-f95ffc78d-pqtcj   1/1     Running   0          14s   172.32.1.21   ip-10-0-5-94-n-bcs-k8s-40015   &lt;none&gt;</code></pre>


<p>可以看到<code>Nginx</code>版本已经从<code>1.12.2</code>更新为<code>1.17.0</code></p>
<pre class="codehilite"><code class="language-bash">[root@ip-10-0-5-94-n-bcs-k8s-40015 ~]# curl 10.0.5.94:30008 -I
HTTP/1.1 200 OK
Server: nginx/1.17.0</code></pre><h1 id="_1">应用的蓝绿发布（原：研发测试环境管理）</h1>
<h2 id="_2">情景</h2>
<p>传统的应用更新方式是<strong>停服更新</strong>，用户在更新期间<strong>无法使用服务</strong>。</p>
<p>接下来，将以 Nginx 从 <code>1.12.2</code> 升级 <code>1.17.0</code> + 程序代码（index.html 的内容从 Nginx 默认页 更新为 1.17.0）为例，看 BCS 中的<strong>蓝绿发布能力</strong>是如何实现<strong>不停机更新</strong>，<strong>用户无感知</strong>。</p>
<h2 id="_3">前提条件</h2>
<ul>
<li><a href="https://kubernetes.io/zh/docs/concepts/">K8S 基本概念</a>，包含 <a href="https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/">Deployment</a>、<a href="https://kubernetes.io/docs/concepts/services-networking/service/">Services</a>；本节教程新增概念：<a href="https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/">ConfigMap</a>、<a href="https://kubernetes.io/docs/concepts/services-networking/ingress/">Ingress</a>、<a href="https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/">Ingress Controllers</a>。</li>
<li><a href="../../../部署指南/产品白皮书/增强包安装/部署安装/BCS-V2.md">完成 BCS 部署</a></li>
</ul>
<h2 id="_4">操作步骤</h2>
<ul>
<li>应用的蓝绿发布逻辑介绍</li>
<li>使用 K8S 资源准备版本</li>
<li>使用 K8S 资源准备新版本</li>
<li>切换流量并观察</li>
</ul>
<h3 id="_5">蓝绿发布逻辑介绍</h3>
<h4 id="_6">发布逻辑示意图</h4>
<p>蓝绿发布，即准备当前运行版本 和 新版本 两组实例，正式发布的时候，修改服务的域名的 DNS 记录将，将其指向新版本的 Ingress 指向的地址 。</p>
<p><img alt="-w1303" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15680799749131.jpg" /></p>
<h4 id="_7">版本更新流程中引入的对象</h4>
<p>以 Nginx 从 <code>1.12.2</code> 升级 <code>1.17.0</code> + 程序代码（index.html 的内容从 Nginx 默认页 更新为 1.17.0）为例，使用以下几个 新的对象：</p>
<ul>
<li>程序代码或可执行文件（index.html） ：Docker 镜像</li>
<li>程序或运行环境配置（nginx.conf） ：ConfigMap</li>
<li>负载均衡器 （LoadBalancer）+ Ingress ： 用户接入和负载均衡</li>
</ul>
<p>其中 Deployment、Service 不再赘述。</p>
<h3 id="k8s">使用 K8S 资源准备版本</h3>
<h4 id="loadbalancer">新增 LoadBalancer</h4>
<p>Ingress 是 K8S 中描述用户接入的对象之一， 需要配合 LB 应用才能对外提供访问。</p>
<p>在 BCS 中，LoadBalancer 背后的技术是 K8S 维护的 <strong>Nginx Ingress Controller</strong>。</p>
<p>选择菜单【LoadBalancer】，点击【新建 LoadBalancer】，选择一个节点作为 LB 对外提供网络接入服务。</p>
<p><img alt="-w1678" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15659439205670.jpg" /></p>
<blockquote>
<p>建议业务 Pod 不调度至 LB 所在的节点，可使用 节点亲和性（nodeAffinity）实现。</p>
</blockquote>
<h4 id="configmap-nginxconf">Configmap ： 存放 nginx.conf</h4>
<p>在【模板集】菜单中，选择【Configmap】，新建 nginx.conf 和 default.conf 两个 configmap，实现<strong>应用程序和配置的解耦</strong>。</p>
<p><img alt="-w1674" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15659435399613.jpg" /></p>
<h4 id="k8s-deployment-serviceingress">创建 K8S 对象 Deployment 、Service、Ingress</h4>
<ul>
<li>创建 Deployment</li>
</ul>
<p>在【Deployment】中，填写 名称、标签（Label）、容器镜像、挂载卷（挂载 Configmap）。</p>
<p><img alt="-w1675" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15659437982262.jpg" /></p>
<p><img alt="-w1672" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15659438850899.jpg" /></p>
<ul>
<li>创建 Service</li>
</ul>
<p>在【Service】中关联 Deployment 以及服务名称、暴露的端口。</p>
<p><img alt="-w1629" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15680918349969.jpg" /></p>
<ul>
<li>新建 Ingress</li>
</ul>
<p>在【Ingress】中填写 【主机名】、【路径】以及绑定 【Service】。</p>
<p><img alt="-w1629" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15680920723966.jpg" /></p>
<h4 id="_8">实例化模板集</h4>
<p>保存模板集后，实例化模板集。</p>
<p><img alt="-w1678" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15659439491084.jpg" /></p>
<p>可以看到对应资源已生成好。</p>
<ul>
<li>Deployment</li>
</ul>
<p><img alt="-w1678" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15659449765672.jpg" /></p>
<ul>
<li>Service</li>
</ul>
<p><img alt="-w1677" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15659450631792.jpg" /></p>
<ul>
<li>Ingress</li>
</ul>
<p><img alt="-w1677" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15659450818610.jpg" /></p>
<p>修改域名解析或修改 PC 上 hosts 文件（Mac 下路径为 /etc/hosts），将 Ingress 中配置的主机名解析到 LoadBalancer 中节点的外网 IP，然后打开浏览器访问。</p>
<p><img alt="-w1115" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15680984160424.jpg" /></p>
<p>以上作为线上环境运行的版本，接下来部署新版本。</p>
<h3 id="k8s_1">使用 K8S 资源准备新版本</h3>
<p>本次新版本参照微服务更新的最佳实践：将应用程序打入 Docker Image，<strong>更新 Deployment 中的镜像即更新版本</strong>。</p>
<h4 id="docker-image">制作新版本的 Docker Image</h4>
<p>以 index.html 为应用程序，将其打入镜像，由于新版本的运行时是 Ningx 1.17.0，故以  Nginx 1.17.0 为基础镜像。</p>
<ul>
<li>准备 dockerfile</li>
</ul>
<pre class="codehilite"><code class="language-bash">$ ll
total 16
-rw-r--r--  1 breaking  staff    49B  9 10 10:55 dockerfile
-rw-r--r--  1 breaking  staff    40B  9 10 10:54 index.html

$ cat index.html

Welcome to BCS.

Nginx Version: 1.17.0

$ cat dockerfile
FROM nginx:1.17.0
COPY index.html /usr/share/nginx/html</code></pre>


<ul>
<li>构建 Docker Image</li>
</ul>
<pre class="codehilite"><code class="language-bash">$ docker build -t bcs_nginx:1.17.0 .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM nginx:1.17.0
 ---&gt; 719cd2e3ed04
Step 2/2 : COPY index.html /usr/share/nginx/html
 ---&gt; 9e1342027c80
Successfully built 9e1342027c80
Successfully tagged bcs_nginx:1.17.0

$ docker images
REPOSITORY                                              TAG                   IMAGE ID            CREATED             SIZE
bcs_nginx                                               1.17.0                9e1342027c80        18 seconds ago      109MB</code></pre>


<ul>
<li>推送镜像到仓库</li>
</ul>
<pre class="codehilite"><code class="language-bash">$ docker tag bcs_nginx:1.17.0 &lt;Registry_URL&gt;/joyfulgame/bcs_nginx:1.17.0

$ docker push &lt;Registry_URL&gt;/joyfulgame/bcs_nginx:1.17.0
The push refers to repository [&lt;Registry_URL&gt;/joyfulgame/bcs_nginx]
8b2c2f2923c8: Pushed
d7acf794921f: Mounted from joyfulgame/nginx
d9569ca04881: Mounted from joyfulgame/nginx
cf5b3c6798f7: Mounted from joyfulgame/nginx
1.17.0: digest: sha256:b608ac54ca92dd092529f9b86403d3a539eab030103e2e0c1a984787ece448c9 size: 1155</code></pre>


<blockquote>
<p>更多 Docker Image 的构建方法可以参考 <a href="https://github.com/nginxinc/docker-nginx/blob/master/stable/alpine/Dockerfile">docker-nginx</a>。</p>
</blockquote>
<h4 id="_9">克隆模板集为新版本</h4>
<p>由于新版本主要在 Deployment 的镜像版本、Ingress 绑定的主机名，以及这几个 K8S 对象的命名差别（同一个命名空间不允许重名），所以克隆模板集，然后修改即可。</p>
<p>点击【复制模板集】，会克隆一个模板集，命名为：蓝绿发布-绿</p>
<p><img alt="-w1678" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15659444709512.jpg" /></p>
<ul>
<li>修改【Deployment】中的名称、标签以及镜像版本。</li>
</ul>
<p><img alt="-w1679" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15681000388594.jpg" /></p>
<ul>
<li>修改【Service】中的名称、关联标签。</li>
</ul>
<p><img alt="-w1620" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15681000844250.jpg" /></p>
<ul>
<li>修改 Ingress，主机名不能上一个版本一样。</li>
</ul>
<p><img alt="-w1631" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15681001549718.jpg" /></p>
<p>最后保存模板集，然后开始实例化模板集。</p>
<p>修改域名解析或修改 PC 上 hosts 文件（Mac 下路径为 /etc/hosts）后，访问 Ingress 中配置的主机名。</p>
<p><img alt="-w513" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15681005088734.jpg" /></p>
<h3 id="_10">切换流量并观察</h3>
<p>如果是客户端业务，将请求的后端地址指向为新版本的主机名即可，如果客户端不方便更新配置，可以使用 CNAME 将域名指向到新的版本的主机名。</p>
<p>观察一段时间，如果没有异常，删除原版本的实例即可。</p>
<p><img alt="-w1626" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CD/assets/15681007939276.jpg" /></p>
<ul>
<li>
<p>蓝绿发布的好处：新版本如果发现异常，可以快速的切换到老版本。</p>
</li>
<li>
<p>蓝绿发布的坏处：预备双倍的资源，直到下线老版本。不过如果有云平台，成本可控。</p>
</li>
</ul>
<p>企业可以结合自身实际情况，选择合适的版本发布方式。</p><h1 id="java-maven-demo">Java Maven Demo</h1>
<p>本篇文章将指导你如何在 bk-ci 编译<strong>Maven</strong>工程。</p>
<h2 id="_1">准备材料</h2>
<ul>
<li>一个 maven 工程：<a href="https://gitlab.com/bk-ci/gs-maven.git">https://gitlab.com/bk-ci/gs-maven.git</a></li>
<li>一个包含 mvn 命令的 CI 镜像：<a href="https://hub.docker.com/r/bkci/ci">https://hub.docker.com/r/bkci/ci</a></li>
</ul>
<h2 id="_2">详细步骤</h2>
<ol>
<li>将准备好的 gitlab 代码库关联至 bk-ci，<a href="../Quickstarts/Link-your-first-repo.md">请参考</a></li>
<li>创建一条空白流水线</li>
<li>将 Linux 构建环境添加到 Job2-1，镜像地址填写：bkci/ci:latest
   <img alt="pic" src="F:\v_awjliu\BKDocs\ZH/6.0/持续集成平台/产品白皮书/assets/examples_java_1.png" /></li>
<li>依次添加如下 4 个插件：</li>
<li>Checkout Gitlab
      <img alt="pic" src="F:\v_awjliu\BKDocs\ZH/6.0/持续集成平台/产品白皮书/assets/quickstart_4.png" /></li>
<li>
<p>Shell Scripts</p>
<p><code>bash
  #!/usr/bin/env bash
  cd initial
  mvn install</code></p>
</li>
<li>
<p>Shell Scripts</p>
<p><code>bash
  #!/usr/bin/env bash
  cd initial
  mvn test</code></p>
</li>
<li>
<p>Upload artifacts
      <img alt="pic" src="F:\v_awjliu\BKDocs\ZH/6.0/持续集成平台/产品白皮书/assets/examples_java_2.png" /></p>
</li>
<li>
<p>运行流水线，观察结果
<img alt="pic" src="F:\v_awjliu\BKDocs\ZH/6.0/持续集成平台/产品白皮书/assets/examples_java_3.png" /></p>
</li>
</ol><h1 id="nodejs-demo">NodeJS Demo</h1>
<p>本篇文章将指导你如何在 bk-ci 编译<strong>NodeJS</strong>工程。</p>
<h2 id="_1">准备材料</h2>
<ul>
<li>一个 NodeJS 工程：<a href="https://gitlab.com/bk-ci/gs-maven.git">https://gitlab.com/bk-ci/gs-maven.git</a></li>
<li>一个包含 npm 命令的 CI 镜像：<a href="https://hub.docker.com/r/bkci/ci">https://hub.docker.com/r/bkci/ci</a></li>
</ul>
<h2 id="_2">详细步骤</h2>
<ol>
<li>将准备好的 gitlab 代码库关联至 bk-ci，<a href="../Quickstarts/Link-your-first-repo.md">请参考</a></li>
<li>创建一条空白流水线</li>
<li>将 Linux 构建环境添加到 Job2-1，镜像地址填写：bkci/ci:latest
   <img alt="pic" src="F:\v_awjliu\BKDocs\ZH/6.0/持续集成平台/产品白皮书/assets/examples_java_1.png" /></li>
<li>依次添加如下 3 个插件：</li>
<li>Checkout Gitlab
      <img alt="pic" src="F:\v_awjliu\BKDocs\ZH/6.0/持续集成平台/产品白皮书/assets/quickstart_4.png" /></li>
<li>
<p>Shell Scripts</p>
<p><code>bash
  #!/usr/bin/env bash
  npm run test</code></p>
</li>
<li>
<p>Upload artifacts
      <img alt="pic" src="F:\v_awjliu\BKDocs\ZH/6.0/持续集成平台/产品白皮书/assets/examples_node_1.png" /></p>
</li>
<li>
<p>运行流水线，观察结果
<img alt="pic" src="F:\v_awjliu\BKDocs\ZH/6.0/持续集成平台/产品白皮书/assets/examples_node_2.png" /></p>
</li>
</ol><h1 id="_1">测试环境自动更新</h1>
<h2 id="_2">情景</h2>
<p>开发同学完成功能开发、本地测试通过后，运维通过自动化工具或人工登录服务器更新，由于开发和运维存在 <strong>沟通成本</strong>，导致持续集成的测试环节效率低下，影响整体研发效率。</p>
<p>接下来看蓝盾（BK-CI）是如何做到 <strong>测试环境自动更新</strong>。</p>
<h2 id="_3">前提条件</h2>
<ul>
<li><a href="../../部署指南/产品白皮书/增强包安装/部署安装/CI-V2.md">部署蓝盾（BK-CI）</a></li>
</ul>
<h2 id="_4">操作步骤</h2>
<ul>
<li>配置自动构建流水线</li>
<li>提交代码（Git Commit）验证</li>
</ul>
<h3 id="_5">配置自动构建流水线</h3>
<p><img alt="bk-ci-demo" src="F:\v_awjliu\BKDocs\ZH/6.0/bk_solutions/CI/assets/bk-ci-demo.png" /></p>
<h3 id="git-commit">提交代码（Git Commit）验证</h3>
<p>下面为一次自动更新记录，从 <strong>提交代码到更新测试环境</strong>，<strong>不到 1 分钟</strong>。</p>
<p>{% video %}assets/bk-ci-demo-HD.mp4{% endvideo %}</p>
    </body>
    </html>
    